버그 잡이

iOS - Github Action으로 Swift Lint 적용하기 본문

Git

iOS - Github Action으로 Swift Lint 적용하기

버그잡이 2023. 4. 23. 12:58

SwiftLint란?

Lint는 소스코드를 분석해주는 툴로 코드 스타일이나 프로그램의 오류가 발생할 수 있는 부분을 찾는 용도로 활용됩니다. 

아래와 같이 강제 언랩핑이나 띄어쓰기 규칙 등을 체크해줄 수 있습니다.

 

이런 SwiftLint 점검을 Xcode 단에서 할수도 있지만
저는 Xcode에 위처럼 경고 문구가 많이 나오는 것을 원치 않기 때문에 PR을 올렸을때 Lint를 체크하는 방식으로 SwiftLint를 활용하려고 합니다.
Github Action 을 활용하면 이를 가능하게 할 수 있습니다.

 

 

Github Action

먼저 "github action swiftlint"로 검색합니다. 

그 결과 아래 링크를 쉽게 찾을 수 있습니다.

https://github.com/norio-nomura/action-swiftlint


Pull Request가 생길때 github action에서 스크립트를 실행하여 swiftLint를 체크해주는 방식입니다.

위 스크립트가 정상 동작하면 아래처럼 PR에 린트 점검한 내역이 달리는 것을 볼 수 있습니다.

 

 

아래 스크립트를 github action에 설정해두니 잘 실행됩니다.

on:
  pull_request:
    paths:
      - '.github/workflows/swiftlint.yml'
      - '.swiftlint.yml'
      - '**/*.swift'

jobs:
  SwiftLint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: GitHub Action for SwiftLint
        uses: norio-nomura/action-swiftlint@3.2.1
      - name: GitHub Action for SwiftLint with --strict
        uses: norio-nomura/action-swiftlint@3.2.1
        with:
          args: --strict

 

그런데 위 스크립트의 경우 변경된 파일에 대해서만 린트 체크를 하는 것이 아니라 모든 소스 파일에 대해서 린트 체크를 합니다.

저는 변경된 파일에 대해서만 체크를 하고 싶은데 말이죠.

 



특정 파일만 적용하기

 

위 깃헙을 보니 변경된 파일에만 적용되는 스크립트도 있습니다.

      - name: GitHub Action for SwiftLint (Only files changed in the PR)
        uses: norio-nomura/action-swiftlint@3.2.1
        env:
          DIFF_BASE: ${{ github.base_ref }}

 

그런데...!

위 스크립트로 해도 전체 파일에 대한 린트 체크가 진행됩니다....


관련해서 이슈가 올라왔지만 유지보수가 안 되고 있더라구요 ㅠㅠ
https://github.com/norio-nomura/action-swiftlint/pull/38

 

Add option to select DIFF_HEAD for changed files comparsion by henry2423 · Pull Request #38 · norio-nomura/action-swiftlint

There's an issue report on #23. The DIFF_BASE: ${{ github.base_ref }} may not work in some cases, for example, the pull_request checking. The reason for that is: For the pull_request, the actions/c...

github.com

비교하는 베이스 브랜치를 선택하는 스크립트 선택하는 로직에 문제가 있는 것 같습니다.

master로 베이스 브랜치가 선택되기 때문에 계속해서 전체 파일 대상으로 린트를 체크하는 것이구요.

 


위 깃헙의 경우 더이상 유지보수가 되지 않아서 다른 깃헙을 찾아봤습니다.
norio-nomura씨가 만든 action을 개선한 action-swiftlint를 찾을 수 있었습니다.

https://github.com/ezraberch/action-swiftlint

 

name: SwiftLint

on:
  pull_request:
    paths:
      - '.github/workflows/swiftlint.yml'
      - '.swiftlint.yml'
      - '**/*.swift'

jobs:
  SwiftLint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Fetch base ref
        run: |
          git fetch --prune --no-tags --depth=1 origin +refs/heads/${{ github.base_ref }}:refs/heads/${{ github.base_ref }}
      - name: GitHub Action for SwiftLint (Only files changed in the PR)
        uses: ezraberch/action-swiftlint@3.2.3
        env:
          DIFF_BASE: ${{ github.base_ref }}
          DIFF_HEAD: HEAD

위에서 비교 브랜치를 잘못 선택하는 이슈가 해결되어 변경된 파일에 대해서만 Lint체크가 가능하게 되었습니다.
추가적으로 위 github에서는 checkout@v1으로 되어 있는데 이는 이전 버전으로 checkout@v3로 수정해서 쓰면됩니다.


 

 

추가 사항

글쓰면서 한번 더 찾아보니 아래 깃헙이 잘 관리되고 있는 것 같네요.
나중에 아래것도 한번 써봐야겠습니다.
https://github.com/sinoru/actions-swiftlint

 

 

 

반응형
Comments