[CI/CD] Github Actions 를 이용한 xcode build & test 자동화

develop branch로 push 하면 build & test 실행하기

naljin
12 min readSep 21, 2021

9월의 단 하나의 목표가 있었다면,,? 바로바로 추석에 github action 포스팅하는 것..

앗,, 해야하는데,,ㅎㅎㅎ 하고 누워있다가 주섬주섬 노트북 챙겨서 나왔읍니다.. 이게 바로 인간 승리?ㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜ

목표

  1. develop 브랜치로 push 하면 👉🏻 build & test 실행
  2. release 브랜치로 push 하면 👉🏻 테스트 플라이트 자동 등록

1. develop 브랜치로 push 하면 👉🏻 build & test 실행

일단 이렇게 무족권 테스트 통과하는 테케 세팅해놓고요,,?

github 레포 -> 상단 탭 Actions -> Set up this workflow 를 챡챡 클릭해줍시다

그럼 요로코롬 기본 템플릿이 뜰텐데여 우리는 파일 이름이랑 기본 내용이랑 다 다시 세팅해줄거거든여?!

사실 파일 이름은 저대로 냅둬도 상관없긴 하지만 명확하게 목적을 파악할 수 있도록 test_on_develop.yml 정도로 재설정해줬어요

그리고 이제 중요한 yml 내용을 봅시다!

아 참고로 이거 작성할 때 들여쓰기 간격 주의해야해요 ㅡㅡ 왜냐? yml의 계층 구조는 들여쓰기로 부모-자식을 구분하기 때문이져. 그니까 걍 들여쓰기 잘 해야하는게 yml 문법인거임!!!!

구조로 보면 대충 요런 늒김스~~?

여기서 마지막으로 작성된 xcodebuild command 를 좀 더 자세히 살펴볼건데요!

먼저 xcodebuild command 란 Xcode 프로젝트 및 workpsace의 build, query, analyze, test, archive 작업을 수행할 수 있는 command랍니다.

사용할 수 있는 다양한 action 및 option은 man page(x-man-page://xcodebuild) 에서 확인 가능합니다.

우리는 xcodebuild command 에서 아래 두개의 action 을 사용하겠다고 명시해줬어요

  • clean 👉🏻 build products 및 intermediate 파일을 build root(SIMROOT)에서 제거
  • test 👉🏻 build root(SIMROOT)에서 scheme을 테스트 (빌드가 성공적으로 진행 된 후에 테스트가 진행됨). scheme과 destination 지정 필요.

test action 을 사용하기 위해서는

  1. 우선 -project 플래그 뒤에 .xcodeproj 파일명을 확장자까지 입력하고 (경로 주의)
xcodebuild clean test -project HappyChuseok/HappyChuseok.xcodeproj

2. 스킴 설정을 위해 -scheme 플래그와 함께 빌드하고자하는 scheme 을 명시해줘야합니다.

-scheme HappyChuseok

3. 또한 -destination 플래그를 사용해서 빌드시 사용할 플랫폼, 기기명, 그리고 iOS 버전을 명시합니다.

-destination 'platform=iOS Simulator,name=iPhone 11 Pro,OS=14.4'

풀로 설정된걸 보면? 요렇게!

xcodebuild clean test -project HappyChuseok/HappyChuseok.xcodeproj -scheme HappyChuseok -destination 'platform=iOS Simulator,name=iPhone 11 Pro,OS=14.4'

아니 처음에 맨페이지에서 test action 설명 볼때 “requires specifying a scheme and optionally a destination.” 이라고 써있길래 저는 -desination 이 optional 인줄 알고 설정은 안했었거든요? 그랬더니

Reason: Cannot test target “HappyChuseokTests” on “Any iOS Device”: A build only device cannot be used to run this target. No supported iOS devices are available. Connect a device to run your application or choose a simulated device as the destination.

요런 에러 뜨면서 빌드 실패했었음요!? optionally 라는 단어가 내가 아는 뜻이 아닌가? 영어 잘하고 싶다 후비적..

튼 위에서 작성한 yml 파일 복붙해서 넣고 develop 푸쉬하잖아요?!!!!? 그럼 Actions 탭에 우리가 작성한 workflow가 트리거 됩니다

위에서 조그맣게 보이는 “Run Test” 라는 이름은 우리가 yml 파일에서 가장 상위에 name: Run Test 으로 작성해줬던 값과 동일하죠?! ㅎㅎ

눌러서 들어가보면 어떤 yml 파일이 어떤 조건에 의해 trigger 됐는지 보여주고 (on: push) 현재 workflow 의 상태를 같이 보여줍니다. 주황색 동그라미는 지금 실행중이라는거!

그리고 좀 이따 다시 들어가보면? ^^,,, 역시 한번에 될리 없지~ 눌러서 들어가보면 더 자세한 에러 로그를 확인 할 수 있는데요!

“Start xcode build 🛠” 쪽에서 에러가 났다고 하고있쥬? 바로 우리가 xcodebuild 명령어 실행한곳!!

흠,, 이제 보자 보자,, 에러를 보자,,

Unable to find a destination matching the provided destination specifier

🤔 머어?? 이 경우는 시뮬레이터 os 버전과 xcode 버전이 맞지 않아 발생하는 문제라는데,,?? 근데 지금 위에 로그 보면 Xcode_12.4.app 사용하고 있다 그러고,, 그러면 시뮬레이터 os 도 14.4로 맞춰주면,, 맞지않나?? 하,,^^

그래서 맨 페이지를 읽으니까 OS 를 latest 로 설정할 수 있더라구요?

그래서 OS를 14.4에서 latest로 바꿔봤어여

-destination "platform=iOS Simulator,name=iPhone 11 Pro,OS=latest"

음 하지만 이걸 포함해서도 진짜 별짓을 다해도 똑같은 에러가 뜨더라구요??ㅎㅎ

아니 똑같은 명령어로 우리 local 에서는 좋았잖아요..◠‿◠

화나서 일단 샤따 내림

그리고 다음날 이어서 구글링을 해보다가 -destination 설정할 때 '프로젝트 최소 설정이 iOS 14.4로 되어 있어서 OS 버전도 변경' 했다라는 내용을 봤습니다

혹시 하고 내 최소 설정 확인해보니까???

하;;;;;;;;;;;;;;;;;;;;;;;; xcode 12.5.1 로 플젝 만들어서 14.5 로 만들어진듯;;;;;;;;;;;;;;;;;;;;;;;; 엑코든 나든 죽일까;;;;;;;;;;;;;

14.4 로 내린 다음에 push 해보니까?? 잘됨 ;;;;;;;;;;

물론 최소 버전을 14.1 같은걸로 내려도? 역시 잘됨;

애초에 Xcode_12.4 가 iOS 버전 14.5를 지원하지 않아서 생기는 문제였을테니까요 흑흑 ㅜㅜ

하 참고로 곧 macOS-latest 가 의미하는 버전이 곧 macOS-11 이 될거고 (현재는 macOS-10.15 인듯), 여기서 사용하는 default Xcode 버전은 12.5.1 라네요. 자세한건 macOS-latest workflows will use macOS-11 참고하세여~

보너스로 만약 “나는 test code 안짜서 테스트케이스 통과하는지 돌려볼 필요 없고 걍 빌드만 잘 되는지 확인하고 싶음~” 하면 요런식으로 쓸 수 있음!

xcodebuild build -project HappyChuseok/HappyChuseok.xcodeproj

다시 테스트코드 돌리는 얘기로 돌아와볼게요. 여기서 작업을 하다가 Alamofire 를 사용할 일이 생기고, cocoapods로 라이브러리를 관리하게 된다면??

  1. pod install 먼저 하고
  2. project가 아니라 workspace로 돌려야함

이 스텝들이 추가로 필요하죠?? github action에서 명령어를 작성할때도 마찬가지입니다

그럼 원래 요랬던 부분을

- name: Start xcode build 🛠
run: |
xcodebuild clean test -project HappyChuseok/HappyChuseok.xcodeproj -scheme HappyChuseok -destination 'platform=iOS Simulator,name=iPhone 11 Pro,OS=latest'

이렇게 바꿔볼게여

- name: Start xcode build 🛠
run: |
pod install --repo-update --clean-install --project-directory=HappyChuseok/
xcodebuild clean test -workspace HappyChuseok/HappyChuseok.xcworkspace -scheme HappyChuseok -destination 'platform=iOS Simulator,name=iPhone 11 Pro,OS=latest'

그러면 성공!

안바꿨을때는 이런 에러가 떴답니다아아아아ㅏ아악

아 힘들어

우선 ‘1. develop 브랜치로 push 하면 👉🏻 build & test 실행' 이건 끝났구,,

‘2. release 브랜치로 push 하면 👉🏻 테스트 플라이트 자동 등록' 이건 다음 시간에 하죠?!?! ◠‿◠

9월안에 가능한 부분인가?? 일단 도망!

다음 글 👉🏻

[CI/CD] Github Actions 를 이용한 TestFlight 업로드 자동화

참고

--

--