Command Line Tool을 사용하여 Xcode 프로젝트를 빌드 및 테스트 하기

devapploper·2020년 11월 21일
12
post-thumbnail

터미널에서 커멘드을 이용해서 Xcode로 부터 생성한 프로젝트를 빌드하는 것이 가능하다는 것은 어렴풋이 알고있었다. 하지만 사실상 Xcode 에서 command + R 단축키, 혹은 실행 버튼을 이용하여 빌드를 진행하면 되기 때문에 알아볼 필요가 전혀 없었고 사용할 이유도 전혀 없었다.
그러다가 BoostCamp 5기 마지막 프로젝트인 부스트 런 클럽의 CI 설정을 위해 Github actions 를 사용하려던 중, xcodebuild 와 같은 커멘드들이 보였고, 이 커멘드를 알아보면서 정리한 내용을 적고자 글을 적었다. 해당 커멘드의 사용 방법은 다양하지만, 이 포스트에서는 빌드 및 테스트를 위한 커멘드에 대해서만 다뤄보려 한다.

도구 갖추기 🛠

우선 xcodebuild 를 사용하기 전에, Command Line Tools 패키지가 있어야 한다.

있는지 없는지 모른다면 터미널에서 xcodebuild 를 실행하면 바로 알 수 있다.

Xcode 프로젝트가 없는 디렉터리에서 해당 커멘드를 실행하면 다음과 같은 문구가 뜬다.

xcodebuild: error: The directory /Users/user_name/Desktop does not contain an Xcode project.

만약 Command not found: xcodebuild 와 같은 맥락의 문구가 보인다면 커멘드 라인 툴 패키지가 설치되어있지 않은 것이다.

터미널을 통한 다운로드 ⬇️

(a) 만약 Xcode가 이미 설치되어 있는 상태라면, 터미널에 sudo xcode-select -s /Applications/Xcode.app/Contents/Developer/ 를 실행하여 Xcode와 같이 설치된 커멘드 라인 툴을 사용하도록 설정이 가능하다.

(b) 터미널에 xcode-select --install 를 실행하여 다운로드 한다. 그리고 sudo xcode-select --switch /Library/Developer/CommandLineTools 를 실행하여 커멘드 라인 툴을 사용하도록 설정한다.

빌드하기 👷

커멘드 라인 툴이 갖춰졌다면 빌드를 시작할 수 있다. Xcode 프로젝트가 있는 디렉터리로 이동하자. 빌드한 뒤에는 테스트도 실행해볼 것이기 때문에 가급적이면 테스트 작성이 되어 있는 프로젝트가 좋다.

(만약 준비된 프로젝트가 없다면 여기 테스트용으로 만들어 놓은 프로젝트를 이용해도 좋다)
👉 git clone https://github.com/seoulboy/GithubActionsTestRepo.git

.xcodeproj 빌드

xcodebuild build \ 
 -project GIthubActionTestProject.xcodeproj \
 -scheme GIthubActionTestProject 

-project 플래그 뒤에 .xcodeproj 파일명을 확장자까지 입력해주고 -scheme 플래그와 함께 빌드하고자하는 scheme 명을 입력하여 실행한다.

xcodebuild 는 기본적으로 build 를 사용하기 때문에 build 를 생략해도 된다.

.xcworkspace 빌드

xcodebuild build \
 -workspace your_workspace_name.xcworkspace \
 -scheme your_scheme_name 

.xcodeproj 빌드때와 마찬가지로 -workspace 플래그 뒤에 .xcworkspace 파일의 확장자와 함께 입력하고, scheme도 명시해준다.

생각보다 간단하고 직관적이지 않은가?

이게 끝이 아니다. xcodebuild 는 다양한 플래그를 통해 다양한 설정이 가능하다.

특정 기기 및 iOS를 선택하여 빌드하기

만약 특정 아이폰 시뮬레이터 혹은 iOS 를 사용하고 싶다면 -destination 플래그를 사용하면 된다.

-destination 플래그 뒤에 빌드시 사용할 플랫폼, 기기명, 그리고 iOS 버전을 명시하면 된다.

xcodebuild build \
 -project GIthubActionTestProject.xcodeproj \
 -scheme GIthubActionTestProject \
 -destination "platform=iOS Simulator,name=iPhone 12,OS=14.2"

iOS 버전을 명시하는 부분인 OS=14.2 는 생략해도 된다. 생략할 시에는 가장 최근 버전에 릴리즈된 iOS를 기본값으로 적용한다.

위의 예시는 .xcodeproj 파일을 빌드하는 것으로 나와있지만 .xcworkspace 파일도 동일하게 -destination 플래그를 사용하여 빌드하는 것이 가능하다.

테스트하기 🧪

테스트하는 것은 빌드와 별반 다를 것이 없다. 그저 위에서 실행했던 커멘드에서 build 부분을 test로 바꿔서 실행하면 된다.

예를 들어 .xcodeproj 파일을 테스트하고 싶다면, 다음과 같이 실행하면 된다.

xcodebuild test \
 -project GIthubActionTestProject.xcodeproj \
 -scheme GIthubActionTestProject \
 -destination "platform=iOS Simulator,name=iPhone 12,OS=14.2"

test 를 실행하면 빌드가 성공적으로 진행 된 후에 테스트를 진행한다.

별도의 빌드 및 테스트 커멘드

xcodebuild 는 xcode 프로젝트를 빌드하고 실행하는 build 커멘드 뿐만이 아니라, 테스트 파일을 생성하기 위한 빌드 커멘드도 따로있는데, 바로 build-for-testing 커멘드이다.

이 커멘드는 일반 빌드 커멘드와는 다르게 .xctestrun 이라는 테스트 파일을 생성하는데, 이 파일은 테스트시 test-without-building 를 커멘드를 사용할 때 실행되는 파일이다.

어쩌면 이쯤에서 이런 커멘드가 있는 이유가 무엇인지 궁금할 수도 있다.

test 커멘드를 사용하면 빌드와 테스트가 한번에 이뤄지는데 build-for-testing 을 실행해서 빌드만 하고, test-without-building 을 실행해서 테스트만 따로하는 건 커멘드를 두번 입력해야하니까 불편하고 비효율적인 방법으로 보일수 있다.

그렇다면 만약 해당 프로젝트가 여러 기기에서도 테스트가 이뤄지는지 확인하고 싶다면 어떻게 할까?

각각의 기기를 명시하여 xcodebuild test ... -destination "platform=iOS Simulator,name=iPhone 11" 와 같은 커멘드를 여러번 실행하게 되는데, 이렇게 하면 해당 기기에 대한 테스트를 진행할 때마다 빌드도 함께 진행된다.

각각의 기기에 따라 매번 빌드하지 않고도 테스트를 할 수 있는 방법이 있는데, 그게 바로 build-for-testing 커멘드를 사용하여 .xctestrun 파일을 생성하고, 해당 파일을 이용하려 다수의 test-without-building 커멘드를 입력하는 것이다.

이렇게하면 빌드를 한번만 진행하여 시간이 단축된다는 장점이 있다. 또한 한번 빌드한 후에 .xctestrun 파일을 다른 테스트를 진행하는 서버로 옮기기만 한다면 여러 서버가 동시에 각각 맡은 테스트를 진행하여 빌드 및 테스트를 보다 빠른 시간내에 처리할 수 있다.

- name: iOS build setup
        run: xcodebuild build-for-testing -scheme your-scheme-test -workspace your_project.xcworkspace -destination 'platform=iOS Simulator,name=iPhone 11,OS=13.1'

      - name: testing ... iPhone 11
        run: xcodebuild test-without-building -scheme your-scheme-test -workspace your_project.xcworkspace -destination 'platform=iOS Simulator,name=iPhone 11,OS=13.1'

      - name: testing ... iPhone 11 Pro Max
        run: xcodebuild test-without-building -scheme your-scheme-test -workspace your_project.xcworkspace -destination 'platform=iOS Simulator,name=iPhone 11 Pro Max,OS=13.1'

      - name: testing ... iPad Air
        run: xcodebuild test-without-building -scheme your-scheme-test -workspace your_project.xcworkspace -destination 'platform=iOS Simulator,name=iPad Air (3rd generation),OS=13.1'

      - name: testing ... iPad Pro 12.9
        run: xcodebuild test-without-building -scheme your-scheme-test -workspace your_project.xcworkspace -destination 'platform=iOS Simulator,name=iPad Pro (12.9-inch) (3rd generation),OS=13.1'

(위 스크립트에 대한 자세한 내용을 보고 싶다면 포스트 하단의 (B) 링크를 참고해주세요)


p.s.

Github Actions 를 사용해보는건 이번이 처음인데 Gitlab 의 CI 툴이나 Jenkins에 비해 사용이 매우 간편하다. 다만 xcode 프로젝트를 바로 빌드하고 테스트하는 workflow 스크립트에 대한 정보가 생각보다 적었다. 아마도 Github Actions가 비교적 최근 생긴 기능이고 다른 CI툴을 주로 사용하기 때문이 아닐까 싶다.

그래도 덕분에 터미널을 이용해서 Xcode 프로젝트를 빌드하고 테스트하는 스크립트를 알아보게 되었다. 예전에 회사 다니면서 CI 관련 지식들을 머리속에 강제로 집어넣어야 했던 아픈 기억이 떠오르기도 했지만, 이렇게 프로젝트에 적용하기위해 알아보니 나름 재미있었다.

내용 작성에 참고한 내용들:
(A) https://www.appsdeveloperblog.com/run-xcode-unit-tests-from-the-command-line/
(B) https://github.com/actions/starter-workflows/pull/172/files
(C) https://medium.com/xcblog/speed-up-ios-ci-using-test-without-building-xctestrun-and-fastlane-a982b0060676
(D) https://stackoverflow.com/a/42953127
(E) https://github.com/ngeri/actions-ios/blob/master/.github/workflows/feature_pipeline.yml
(F) https://stackoverflow.com/a/58990877

profile
app 을 dev 하는 developer. devapploper 입니다

1개의 댓글

comment-user-thumbnail
2020년 12월 2일

젛아염

답글 달기