iOS/개념 & 개발

[iOS] Unit Test를 GitHub Actions로 자동화하며 겪은 에러 해결 과정

유정주 2024. 4. 27. 09:57
반응형

Unit Test 자동화

GitHub Actions를 활용하면 Xcode에서 작성한 Unit Test를 자동으로 체크할 수 있습니다.

PR을 생성할 때, push를 할 때 등의 액션이 발생하면 Unit Test를 수행하는 방식입니다.

Test 편의성과 안정성을 동시에 챙길 수 있으므로 꼭 필요한 과정입니다.

 

 

GitHub Actions로 자동화하며 겪은 에러

저는 GitHub 안에서 개인 프로젝트 사이클을 돌리고 싶었기 때문에 GitHub Actions를 선택하였는데요.

쉽게 가능할 줄 알았지만, 많은 에러를 겪었습니다.

 

고군분투의 흔적 ;;

결과론적인 이야기지만, 앞에서부터 차근차근 살펴봤다면 쉽게 해결했을 텐데... 반성합니다 🥲

성공한 Workflow는 최하단에 있으니 최종 결과만 필요하시면 쭉 내리시면 됩니다.

 

낮은 Swift 버전으로 빌드됨

Workflow 파일

더보기

name: Run Test

on:
  push:
    branches: [ develop ]
  pull_request:
    branches: [ develop ]

jobs:
  build:
    runs-on: macos-latest

    steps:
    - uses: actions/checkout@v3
    - name: Start xcode build 🛠
      run: |
        xcodebuild clean test -project RefactorMoti/RefactorMoti.xcodeproj \
        -scheme RefactorMoti \
        -destination 'platform=iOS Simulator,name=iPhone 13,OS=latest'

 

클로저 안에서 self를 사용하지 않았다는 컴파일 에러가 발생했습니다.

Swift 5.8부터는 guard let self else { ... } 을 작성하면 self를 생략할 수 있는데요.

제가 기대한 Swift 버전은 Swift 5.9인데 Swift 5.8보다 낮은 Swift 버전으로 빌드가 된 거죠.

 

문제 원인

로그 상단을 보니 Xcode 14.2로 수행되고 있는 것을 발견했고, Xcode 15로 설정하여 시도해 보았습니다.

 

Xcode 버전 설정이 안 됨 (Xcode 14.2로만 빌드됨;)

Workflow 파일

더보기

name: Run Test

on:
  push:
    branches: [ develop ]
  pull_request:
    branches: [ develop ]

jobs:
  build:
    runs-on: macos-latest

    steps:
    - uses: actions/checkout@v3
      with:
        xcode-version: '15.0'
    - name: Start xcode build 🛠
      run: |
        xcodebuild clean test -project RefactorMoti/RefactorMoti.xcodeproj \
        -scheme RefactorMoti \
        -destination 'platform=iOS Simulator,name=iPhone 13,OS=latest'

Swift 5.9로 수행하기 위해 Xcode Version을 15.0으로 설정했습니다.

 

하지만 여전히 Xcode 14.2로 빌드되고 있었습니다.

이후로도 다양한 Xcode 버전 설정을 시도해 봤지만 전부 실패했습니다.

모두 Xcode 14.2로 빌드되었기 때문에 이유를 생각해 보았습니다.

 

문제 원인

macOS 버전을 latest로 설정했는데 12.7.4로 빌드되고 있었습니다.

 

해당 macOS의 Xcode 최신 버전이 14.2였기 때문에 계속 Xcode 14.2로 수행되고 있던 거였어요.

 

Xcode 15로 빌드 성공! 하지만 signing certificate을 찾을 수 없음

Workflow file

더보기

name: Run Test

on:
  push:
    branches: [ develop ]
  pull_request:
    branches: [ develop ]

jobs:
  build:
    runs-on: macos-14

    steps:
    - name: List Xcode installations
      run: sudo ls -1 /Applications | grep "Xcode"
    - name: Select Xcode 15.0
      run: sudo xcode-select -s /Applications/Xcode_15.0.app/Contents/Developer
    - uses: actions/checkout@v3
    - name: Start xcode build 🛠
      run: |
        xcodebuild clean test -project RefactorMoti/RefactorMoti.xcodeproj \
        -scheme RefactorMoti \
        -destination 'platform=iOS Simulator,name=iPhone 13,OS=latest'

macOS 버전을 14로 명시하면서 드디어 Xcode 15로 빌드되었어요.

 

하지만 Signing Certification을 찾을 수 없다는 에러가 발생했어요.

 

문제 원인

Xcode를 보니 설정이 안 되어 있었어요;

프로젝트를 새로 생성하면서 팀 설정을 잊은 거예요..

 

Team 설정을 완료하여 해당 이슈를 해결했습니다.

 

드디어 성공

Workflow file

name: Run Test

on:
  push:
    branches: [ develop ]
  pull_request:
    branches: [ develop ]

jobs:
  build:
    runs-on: macos-14

    steps:
    - name: List Xcode installations
      run: sudo ls -1 /Applications | grep "Xcode"
    - name: Select Xcode 15.3
      run: sudo xcode-select -s /Applications/Xcode_15.3.app/Contents/Developer
    - uses: actions/checkout@v3
    - name: Start xcode build 🛠
      run: |
        xcodebuild clean test -project RefactorMoti/RefactorMoti.xcodeproj \
        -scheme RefactorMoti \
        -destination 'platform=iOS Simulator,name=iPhone 15,OS=latest'

macOS 설정, Xcode 설정, 팀 설정을 거쳐 드디어 빌드에 성공했습니다.

 

 

아주 만족스러움

develop에 PR 생성 또는 push를 하면 자동으로 돌아가게 설정하니,

테스트에 대한 부담감이 크게 줄었습니다.

아주 만족스러워요 ㅎ

 

옛날부터 하고 싶었는데 테스트 코드 자체가 낯설어서 아예 시도를 못 했거든요.

지금에서야 시도하는 게 부끄러우면서 뿌듯하기도 합니다.

한 번 해보니 이 쉬운걸(?) 왜 이제야 했을까 싶기도 하고 ㅎ

 

 

앞에서부터 살펴봤으면...

결과론적인 이야기지만..

에러가 발생했을 때 macOS 버전부터 확인했으면 아주 빠르게 해결할 수 있었을 텐데 아쉬웠습니다.

 

개발하다 문제가 생기면 Bottom Up 형식으로 디버깅을 하잖아요?

Crash가 발생한 코드 확인 -> 그 코드를 호출한 코드 확인 -> ... 이런 식으로요.

이렇게 하다 보니 여기에서도 아래에서부터 확인을 한 거 같아요.

상황에 따라 디버깅의 순서를 파악해야 한다는 것을 배운 경험이었습니다.

 

 

감사합니다.


아직은 초보 개발자입니다.

더 효율적인 코드 훈수 환영합니다!

공감 댓글 부탁드립니다.

 

 

반응형