-
Notifications
You must be signed in to change notification settings - Fork 0
Github Action과 tuist로 CI 구축하기
저희는 Pull Request를 올릴 때 리뷰어끼리 코드를 파악하고 리뷰를 다는 방식으로 merge를 진행해왔지만, 가끔씩 파일을 다른 폴더에 두었다든지, 알고보니 에러가 내제된 코드였다든지, 그 밖의 여러 상황에 의해 다시 수정작업한 PR을 올리고는 합니다.
저희는 이러한 리소스를 사전에 방지하고자 테스트 코드를 만들고 수행하여 정상적인 코드인지를 판단하는 작업을 진행했습니다. 하지만, 이것 역시 Xcode 내에서 리뷰어마다 일일히 테스트코드를 동작시킬 수는 없는 노릇입니다.
그래서 GIthub Action을 이용해서 Pull Request가 올라올 때마다 test code를 자동으로 실행시켜주는 플로우를 만들기로 결심했습니다. 그리고 그 과정에서 헤매보고 뒤돌아보는 과정을 보여드리려고 합니다.
아시다시피 .github/workflows
폴더에 yaml를 등록해두면, 자동으로 워크플로우가 실행되는 것은 다 아시리라 생각합니다. 저는 Tuist로 프로젝트를 관리하고 있었고, 다행히 tuist에서는 test 명령어를 지원해주기에 workflow를 다음과 같이 작성해서 시도하면 되겠다고 생각했어요.
name: CI
on:
push:
branches: ["main"]
jobs:
build:
runs-on: macos-
steps:
- uses: actions/checkout@v3
ios-job:
runs-on: macos-latest
steps:
- name: Run Tuist Test
run: tuist test
하지만 우리 눈 앞에 보이는 건 Tuist를 인식하지 못한다는 당혹스러운 오류일 거에요. 애꿎은 Github Action을 탓할 수도 없고.. 차근차근히 수정해봅시다!
latest
간단한 방법은 Tuist를 설치하는 job을 설정하는 겁니다. 새로운 run을 추가해서 tuist를 설치하고 version을 확인하는 작업과 함께 test를 돌리는 workflow를 만들어보겠습니다.
저희가 터미널에서 brew를 이용해 설치하는 것처럼 동일한 명령어를 작성해볼게요.
name: CI
on:
push:
branches: [ "main" ]
jobs:
build:
runs-on: macos-latest
steps:
- uses: actions/checkout@v3
ios-job:
runs-on: macos-latest
steps:
- name: Install Tuist # Tuist 설치
run: brew install tuist
- name: Print Tuist Version # Tuist 버전 확인
run: tuist version
- name: Run Tuist Test # Tuist test 명령어 실행
run: tuist test
그리고 나서 테스트를 해보면 다른 오류가 뜨는 걸 볼 수 있는데요..
대체 왜 오류가 뜨는지 모르겠어서 하나씩 수정해가면서 확인한 결과, actions/checkout@v3
라는 작업을 분리해둬서 인식하지 못했던 오류였습니다 ㅜㅜ.. 지금 보면 jobs가 두 갈래로 나뉘는 걸 볼 수 있는데요. 이 부분을 하나의 jobs로 합쳐야 합니다.
jobs:
ios-job:
runs-on: macos-latest
steps:
- uses: actions/checkout@v3 # build jobs에 있던 checkout 액션을 합침
- name: Install Tuist # Tuist 설치
run: brew install tuist
- name: Print Tuist Version # Tuist 버전 확인
run: tuist version
- name: Run Tuist Test # Tuist test 명령어 실행
run: tuist test
→ checkout 액션은 저희가 작업한 코드를 불러오는 작업을 맡습니다. 그래서 저희 코드를 테스트하기 위해서 필수로 불러줘야하는 작업이에요.@
를 기준으로 버전이 나뉘는데, 오늘(2023년 11월 18일)을 기준으로 v4까지 나왔네요.
다시 테스트로 GitHub Action
을 돌려보면, UIColor의 값이 존재하지 않다는 걸 볼 수 있습니다.
저희 프로젝트에서는 Assets에 컬러색상을 담아놓고, Xcode가 자동으로 Resource에 있는 값을 static 변수로 만들어주는 옵션을 사용해서 값을 설정해주고 있었습니다. 그리고 그건 Xcode 15 버전부터 자동완성을 해줘요.
다시 저희 yaml 파일로 돌아가봅시다. 저희는 runs-on
이 **macos-latest
**로 되어있는데요. macos-latest 이미지의 macOS 버전은 무엇이고, Xcode의 버전은 무엇일까요?
name: CI
on:
push:
branches: [ "main" ]
jobs:
build:
runs-on: macos-latest
steps:
- uses: actions/checkout@v3
ios-job:
runs-on: macos-latest
steps:
- name: Install Tuist # Tuist 설치
run: brew install tuist
- name: Print Tuist Version # Tuist 버전 확인
run: tuist version
- name: Run Tuist Test # Tuist test 명령어 실행
run: tuist test
자료를 찾아보았을 때 runners images는 아래 GitHub 사이트에서 확인할 수 있었습니다. 오늘 기준(2023년 11월 18일)으로 macos-latest의 macOS버전은 12버전, 즉 macOS Monterey
버전이었고, Xcode를 실행하는 기본 옵션은 Xcode 14.2
버전이었습니다.
https://github.com/actions/runner-images
Xcode 15버전을 적용해야하는 저희 입장에서는 macOS버전을 바꿔야했고, 다행히 macos-13
에서 Xcode 15.0.1
을 지원하고 있었습니다. macos-13의 기본 Xcode 버전은 14.3.1
이므로 **15.0.1
**로 바꿔주어야 합니다. 그래서 maxim-lobanov가 만든 setup-xcode를 사용하여 저희가 원하는 버전으로 세팅했습니다.
그래서 yaml을 파일을 아래와 같이 다시 수정했습니다.
https://github.com/maxim-lobanov/setup-xcode
# This is a basic workflow to help you get started with Actions
name: CI
on:
push:
branches: ["main"]
jobs:
tuist-job:
runs-on: macos-13 # macos-13으로 변경
steps:
- uses: maxim-lobanov/setup-xcode@v1 # Xcode 버전 변경
with:
xcode-version: "15.0.1" # 15.0.1로 변경
- uses: actions/checkout@v3
- name: Install Tuist
run: brew install tuist
- name: Print Tuist Version
run: tuist version
- name: Run Tuist Test
run: |
tuist fetch
tuist test
하지만 다시 오류가 발생했습니다.
내용을 보면 분명 test를 통과했는데도 불구하고, xcodebuild command exited with error code 65
로 인해 테스트 실패가 된 것이죠..
…
……
………..
정말 많이 찾아보고 테스트해봤는데요…. 우선 인터넷에서는 제가 원하는 해결책을 찾을 수 없었습니다.
그래서 테스트할 때 경고표시 되어있는 것들은 전부 제거해보기도 하고, tuist 옵션 값을 건드려보기도 했지만 소용없었어요.
그러다가 프로젝트 파일을 확인하던 도중 어느 모듈에서 Tests타겟을 등록했던 곳에 Test 파일을 넣어두지 않은 것을 보았고 혹시나 하는 마음에 항상 성공하는 XCTestCase 클래스를 하나 생성해서 세팅만 해주고 테스트를 해보았습니다..
그러더니 잘 되더라고요 하하.
자, 지금까지는 git에서 최상위폴더에 있는 xcode project와 tuist를 가지고 github action을 테스트했었는데요.
저희 팀에서는 BackEnd와 같은 레포지토리를 공유하고 있어서 상위폴더를 iOS
와 BackEnd
로 구분지어놓고 있습니다.
그래서 yaml파일을 약간 수정할 필요가 있어요. 다행히 working-directory
라는 옵션이 있어서 특정 디렉토리에서 작업을 수행하도록 처리할 수 있습니다.
name: CI
on:
push:
branches: ["main"]
jobs:
tuist-job:
runs-on: macos-13
env:
working-directory: ./iOS # iOS 폴더로 경로 지정(상대경로는 git 최상위 폴더 기준)
steps:
- uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: "15.0.1"
- uses: actions/checkout@v3
- name: Install Tuist
run: brew install tuist
working-directory: ${{env.working-directory}} # env에서 설정한 directory값을 추가
- name: Print Tuist Version
run: tuist version
working-directory: ${{env.working-directory}} # env에서 설정한 directory값을 추가
- name: Run Tuist Test
run: |
tuist fetch
tuist test
working-directory: ${{env.working-directory}} # env에서 설정한 directory값을 추가
일일히 경로를 지정해주어도 상관없어요. 저는 env옵션에서 값을 설정해둠으로써 나중에 경로를 수정할 상황이 생길 때 env의 working-directory라는 값만 수정해서 빠르게 경로를 바꿀 수 있도록 처리해두고 싶었습니다.
드디어 Github Action으로 모듈화된 프로젝트 전부를 테스트를 할 수 있게 되었습니다. 하지만, runner의 속도가 매우 느리다보니 별 거 없는 테스트코드임에도 5분이상이 걸리는 것을 알 수 있었어요.
BankSalad사(仕)에서는 별도에 테스트코드를 동작시킬 고성능의 mac을 구매해서 사용하고 있다고 블로그에서 얼핏 본적이 있었는데, 그 이유가 납득이 가는 장면이었습니다.
그리고 꽤나 Github Action을 Tuist로 시도하는 과정에서 오류를 많이 접했는데요, 인터넷에 많은 정보가 나와있지 않아서 3시간이 걸릴 것 같았던 이 작업이 5시간이 걸려버렸어요. 하하
그래도 직접 오류를 파헤치면서 해결하는 과정이 재밌었던 시간이었고, 앞으로 Github Action을 다루게 된다면 자신감있게 다룰 수 있을 거라는 확신이 들었습니다. 🙂
그 밖에 test할 때 iPhone Device를 설정하거나 os를 설정할 수 있는데요. 이 파트는 다음에 천천히 작업해나가면서 작성해보도록 하겠습니다.
읽어주셔서 감사합니다. 🙇
→ 테스트한 레포지토리
working-directory invalid 수정 · WhiteHyun/GithubActionPractice@22468b2