이번 합동세미나에서는 SwiftLint를 사용하기로 했습니다!
SwiftLint란 무엇인지, 또 깃허브 액션과 연결하여 사용하는 방법에 대해 작성하겠습니다.
SwiftLint란 코드 스타일을 분석해주는 정적도구인데요.
내가 작성한 코드들에서 규칙에 어긋나는 코드를 찾아내서 경고 또는 빌드 에러를 반환해 주기 때문에 일관된 코드 스타일을 유지하고, 코드 품질을 향상시킬 수 있습니다. 협업 시에 일관된 코드 스타일을 유지할 수 있어 편리하다고 합니다.
저는 homebrew를 이용해서 설치했습니다.
homebrew install swiftlint
homebrew로 설치가 완료되면, xcode의 프로젝트에서 Build Phase에 들어가줍니다.

위에 +를 누르고, New Run Script Phase를 클릭해 새로운 스크립트를 만들어줍니다.
그리고 밑에 스크립트에 다음과 같이 작성해줍니다. 스크립트 이름은 SwiftLint Script로 바꿔줬습니다.
# Type a script or drag a script file from your workspace to insert its path.
if [[ "$(uname -m)" == arm64 ]]; then
export PATH="/opt/homebrew/bin:$PATH"
fi
if which swiftlint > /dev/null; then
swiftlint
else
echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint"
fi

위의 단계들이 끝나면 규칙들을 작성해야합니다.
프로젝트 루트에 .swiftlint.yml 파일을 만들어줍니다.
Swiftlint 규칙은 여기서 확인할 수 있습니다
저희 팀의 코드컨벤션에 맞춰 어떤 규칙을 비활성화할지, 어떤 규칙을 추가할지에 대해 작성해주었습니다.
disabled_rules:
# 비활성화하고 싶은 규칙
- identifier_name
- line_length
- type_name
- legacy_constructor
- unused_setter_value
- void_function_in_ternary
- nesting
- comment_spacing
- cyclomatic_complexity
opt_in_rules:
- function_parameter_count
- function_body_length
- trailing_whitespace
- empty_count
- empty_string
- closure_end_indentation
- let_var_whitespace
included:
- TODOMate
excluded:
- TODOMate/App/AppDelegate.swift
- TODOMate/App/SceneDelegate.swift
included에는 프로젝트 파일을 포함시켜주고, excluded에는 AppDelegate와 SceneDelegate를 작성해서 검사에서 제외될수 있게 합니다.
이후 Cmd+B로 빌드시켜보면 규칙이 어긋나는 부분에 경고가 나타나게 됩니다.

깃허브 내에 .github/workflows 경로로 .swiftlint.yml 파일을 만들어줍니다.

그리고 다음과 같이 파일을 작성합니다.
name: SwiftLint
on:
pull_request:
paths:
- '.github/workflows/swiftlint.yml'
- '.swiftlint.yml'
- '**/*.swift'
jobs:
lint:
name: Run SwiftLint
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Run SwiftLint using config file
uses: norio-nomura/action-swiftlint@3.2.1
with:
args: --config TODOMate/.swiftlint.yml

이렇게 하면 pr을 올렸을 때 swiftlint가 자동으로 코드를 검사하여, 통과하지 못하면 머지를 할 수 없게 됩니다.
빌드했을 때는 잘 되는데, pr에 올라가면 검사를 통과하지 못하는 이슈가 발생했습니다.
이때, PR내의 File Change에 들어가면 어디서 통과하지 못했는지 볼 수 있는데요. 이 경우 AppDelegate와 SceneDelegate에서 계속 통과하지 못했습니다.
이상하죠... yml 파일에서 분명 exclude시켰는데 말이죠..?
저희팀 천재리드에게 sos를 쳤는데 깃허브액션이 swiftlint yml 파일을 못찾는것 같다고 말해줬습니다.
그래서 열심히 서치를 해보다가 이 아티클을 발견했는데요!
문제는 바로 여기였습니다.
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Run SwiftLint using config file
uses: norio-nomura/action-swiftlint@3.2.1
with:
args: --config .swiftlint.yml
처음에는 args 부분에 정확한 경로명을 적어두지 않고, .swiftlint.yml만을 적어두었습니다.
이곳의 경로명을 정확하게
TODOMate/.swiftlint.yml
라고 작성해주니 성공적으로 CI 세팅을 마칠 수 있었습니다!
오!! SwiftLint 진짜 관심있었는데 감사합니다
따라서 도전해볼게여🔥