본문 바로가기

iOS

📱Github action을 사용해서 iOS프로젝트 자동으로 테스트시키기

요즘에 주변 사람들이 한번씩 사용해보면서 괜찮다면서 한번 사용해보라는 녀석이 있는데요!
바로 Github Action입니다.
자신이 진행하고있는 프로젝트 깃허브 레포에 들어가게되면 상단에 있는 탭중에 Actions라는 탭이 보일겁니다.
자동화 도구인 CI/CD툴을 깃허브에서도 제공해주는겁니다.

GitHub Actions
GitHub Actions makes it easy to automate all your software workflows, now with world-class CI/CD. Build, test, and deploy your code right from GitHub. Make code reviews, branch management, and issue triaging work the way you want.

간단한 예로는 내가 푸시를 할 때마다, 혹은 PR을 날릴때마다 프로젝트에 문제가 있는지 없는지 자동으로 테스트를 돌려주거나 빌드를 해보거나 배포까지 도와줍니다.
이녀석을 사용해서 XCODE프로젝트에도 적용을 해보겠습니다.


Workflows 설정하기

XCode프로젝트에 맞는 GitHub Actions를 설정하기 위해 Swift라고 되어있는 영역의 Set up this workflow를 눌러줍시다.
현재 나의 레포가 XCode로 구성되어있다면 깃허브에서 자동으로 추천해줍니다.
(현재 레포가 설정되어있지 않다면 아래에 그리드 형태로 나오는 아이템들중에 스위프트를 찾아서 눌러줍시다.)

Setup this workflows를 선택하면 위와같은 에디터 화면이 발생합니다.
여기에서 스크립트를 설정해주면 자신이 원하는 조건이 트리거될때마다 원하는 형태의 행동을 실행시킬 수 있습니다.
스크립트를 대략적으로 읽어보면 맥락을 쉽게 파악할 수 있네요!


Workflows 설정하기 - 트리거 조건 설정

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

on: 언제 행동을 트리거시킬지에 대한 문법입니다.
push:라고 적혀있는걸 보니 push가 되었을때 발생했을때 트리거되는 것 같습니다. 그리고 그 안에 branches: [develop] 이라고 되어있는 것을 보니 devlop브랜치에 푸시가 되었을 때 발생하도록 설정이 되는 문법 같네요!

그 밑에 pull-request:는 푸시와 비슷하게 PR이 날라왔을때 발생을 하는 것 같은데 위와 동일하게 develop브랜치에 PR이 날아왔을 때 트리거가 되는 것 같습니다.

on:
  push:
    branches: [ feature/* ]
  pull_request:
    branches: [ master ]

저는 현재 제가 작업중인 features/ 안에 들어있는 브랜치들에 대해서 푸시가 발생했을때마다 테스트를 시키고 싶어서 약간 수정해보았습니다. 이렇게 수정하면 feature/ 로 시작하는 브랜치들에서 푸시가 발생했을 때마다 트리거를 발생시킬 수 있습니다.
(PR에 대한 트리거 조건은 따로 원하는 조건이 현재로썬 없어서 마스터로 설정해두었습니다.)


Workflows 설정하기 - 트리거 발생시 실행할 행동 설정

jobs:
  build:

    runs-on: macos-latest

    steps:
    - uses: actions/checkout@v2
    - name: Build
      run: swift build -v
    - name: Run tests
      run: swift test -v

언제 트리거 시킬지에 대한 설정은 완료가 되었고 그 아래에는 어떤 행동을 할지 설정을 하는 스크립트가 있습니다.
runs-on: 어느 플랫폼에서 실행시킬지 설정하는 필드입니다. (우리는 iOS기 때문에 macos-latest로 설정하면 됩니다.)
uses: 테스트를 하기 위해선 레포지토리의 코드 복사본이 필요한데요. 이 과정을 해주는 녀석입니다. workflow를 실행하기전에 반드시 실행해야한다고 하네요.
(name, run): 실행할 작업의 이름과 명령어를 입력해주시면 됩니다. 기본으로 적혀져있는 코드는 swift 컴파일러로 빌드하는 명령어입니다.
(name, run)은 하나의 작업에서 여러번 실행할 수 있습니다. 위에서는 기본적인 빌드와 테스트에 대한 명령어가 적혀져있네요.

저는 빌드의 과정보다는 프로젝트에 작성해놓은 테스트들을 실행시키기 위해 스크립트를 조금 수정했습니다.

jobs:
  build:

    runs-on: macos-latest

    steps:
    - uses: actions/checkout@v2
    - name: Run tests
      run: |
        pod install --repo-update --clean-install --project-directory=thereto-ios/
        xcodebuild test -workspace thereto-ios/thereto-ios.xcworkspace -scheme thereto-ios -destination 'platform=iOS Simulator,name=iPhone 11 Pro,OS=13.6'

XCode 테스트를 실행시키는 커맨드를 구글링으로 찾아서 입력하였습니다.
추가적으로 테스트에서 외부 pod 라이브러리들을 사용하기 때문에 테스트 커맨드 실행 전에 pod install을 시켜주었습니다.
pod install을 시켜주지 않고 바로 테스트 커맨드를 실행시켰을 경우, 라이브러리 인식을 하지 못하고 에러를 발생시킵니다.
(또 하나의 주의사항으로 제가 몇시간동안 삽질한 것이 있는데... 저는 명령어를 여러개 입력하기 위해 "|" 로 시작했는데 해당 문자를 반드시 run: 입력 후 한칸 띄워주세요.. 띄워쓰기를 안하고 붙여쓰면 스크립트 인식을 하지 못한답니다 ㅠㅠ)


Workflows 설정하기 - 저장

스크립트 설정을 모두 끝내고 우측 상단에 Start commit버튼을 눌러서 프로젝트에 GitHub Action을 저장해줍니다.
첫번째 옵션을 선택하고 파일을 생성하면 현재 브랜치에 파일이 생성되며 커밋되고, 두번째 옵션을 선택하면 새로운 브랜치가 생성되며 거기에 커밋이 됩니다. (원하는 옵션으로 선택하시면 됩니다!)
저장을 누르면 프로젝트디렉토리/.github/workflows/swift.yml 파일이 생성되었습니다!!


테스트 동작시켜보기

이제 제대로 종작하나 확인하기 위해 features/에 속한 브랜치에서 푸시를 날려보면 되겠네요!
그리고 테스트를 동작시키기 위해선 기존에 사용하던 Unit Test파일들이 있어야합니다!
푸시를 날리면 GitHub Action 페이지가 이렇게 변합니다!

푸시를 날릴때마다 action이 실행되어 자동으로 테스트를 진행시켜줍니다!
라이브러리까지 설치하고 테스트를 진행하다보니 테스트 한번에 20분 가까이 소요되네요... (생각보다 오랜 시간이 걸리는군요)

테스트에서 Failed된 녀석들을 확인하기위해 위 사진처럼 눌러서 들어가게되면 어디서 테스트가 실패했는지 혹은 의도하지 않은 오류가 발생했는지 로그로 확인할 수 있습니다.
제 로그의 경우에는 로그 길이가 너무 길어서 우측 상단에 더보기 버튼 > View raw logs를 통해 확인했습니다.
(View raw logs를 누르면 새로운 웹페이지가 발생하고 전체 로그를 보실 수 있습니다.)

마지막에 SplashTests파일에 있는 testCheckAuth2() 함수에서 Failed되었다고 알려주네요!
XCode내에서 테스트 할때는 테스트 통과를 했었는데, Github action으로 테스트를 돌리면 Failed가 나오네요.. 정확하게 어떤것이 원인인지는 모르겠네요..ㅠㅠ 일단 해당 테스트만 주석처리하고 다른 테스트만 실행하도록 푸시를 해볼께요.

똑같이 20분 조금 넘게 소요가되긴했지만.. 테스트에 통과한 것을 볼 수 있습니다!
이렇게 GitHub Action을 사용해서 푸시할때마다 자동으로 테스트를 시키도록 설정해보았습니다!