이번 포스팅에서는 코딩 컨벤션 체크에서부터, 단위 테스트, 코드 사이닝, iOS 앱 빌드, TestFlight에 앱을 배포한 것에 이르는 일련의 과정을 자동화하는 GitLab CI/CD 파이프라인을 구성하는 방법에 대해 알아보겠습니다.
“GitLab과 Fastlane으로 iOS 앱 빌드 및 배포 자동화하기” 시리즈의 지난 두 개의 포스팅에서 다루었던 macOS Runner와 Fastlane으로 구성했던 각 Lane을 활용하여 GitLab CI/CD 파이프라인을 구성하고 실행합니다.
이번 글에서 설명하는 내용을 이해하기 위해서는 AWS EC2 Mac 인스턴스에 GitLab Runner 설치하기와 iOS 앱 배포 자동화를 위한 Fastlane 설치 및 구성을 먼저 읽어 보는 것이 좋습니다.
macOS Runner 확인
GitLab CI/CD 파이프라인을 구성하고 실행하기 전에, 프로젝트에서 사용할 수 있는 하나 이상의 Runner가 등록되어 있는지 확인해야 합니다. GitLab에서 Runner는 CI/CD Job을 실행하는 에이전트입니다.
iOS 앱 을 빌드하고 배포하기 위해서는 macOS Runner가 필요합니다.
macOS Runner에 Xcode도 설치되어 있어야 합니다.
아래와 같이 수행하면 프로젝트에서 사용할 수 있는 macOS Runner가 있는지 확인할 수 있습니다.
- GitLab 프로젝트의 왼쪽 사이드 바에서 Settings > CI/CD 선택
- Runners 섹션에서 Expand 버튼 클릭
- Specific runners, Group runners 또는 Shared runners 영역의 사용 가능한 러너 목록에 macOS Runner가 있는지 확인
아래 이미지처럼 Runner 번호 옆에 녹색 원 아이콘이 있으면 사용 가능 상태이고, Runner를 등록할 때 지정한 태그 ios
또는 monterey
를 포함하면 macOS Runner입니다.
사용 가능한 macOS Runner가 없으면, AWS EC2 Mac 인스턴스에 GitLab Runner 설치하기를 참고하여 macOS Runner를 설치하고 등록합니다.
참고로 GitLab에는 액세스 가능한 범위에 따라 세 가지 유형의 Runner가 있으며, 이 중에 하나 이상의 사용 가능한 macOS Runner가 있으면 됩니다.
- 공유 러너(Shared runners)는 GitLab 인스턴스의 모든 그룹 및 프로젝트에서 사용할 수 있습니다. (Admin Area의 Overview > Runners)
- 그룹 러너(Group runners)는 그룹의 모든 프로젝트와 하위 그룹에서 사용할 수 있습니다. (그룹의 Settings > CI/CD > Runners 섹션)
- 특정 러너(Specific runners)는 특정 프로젝트와 연결됩니다. 일반적으로 특정 러너는 한 번에 하나의 프로젝트에 사용됩니다. (프로젝트의 Settings > CI/CD > Runners 섹션)
.gitlab-ci.yml
파일 생성
.gitlab-ci.yml
파일은 GitLab CI/CD에 대한 특정 지침을 구성하는 YAML 파일입니다.
이 파일에서 러너가 실행해야 하는 작업(Job)의 구조와 순서, 특정 조건이 발생할 때 러너가 내려야 하는 결정 등을 정의합니다.
iOS 앱을 빌드 및 배포 자동화하는 GitLab CI/CD 파이프라인을 구성하기 위해 .gitlab-ci.yml
파일을 생성하고, 첫 번째로 lint
Job을 정의합니다. fastlane/Fastfile
파일에 Swift 스타일 및 코딩 컨벤션을 체크하는 Lint Lane이 정의되어 있습니다. lint
Job은 이 Lint Lane을 실행합니다.
-
GitLab 프로젝트 페이지에서 Web IDE 버튼을 클릭합니다.
-
왼쪽 사이드 바에서 New file 아이콘을 클릭합니다.
-
Create new file 모달 창에서
.gitlab-ci.yml
을 클릭합니다. -
Choose a template…
을 클릭한 후, Search 입력란에ios
을 입력하고 iOS-Fastlane을 선택합니다. -
아래와 같이 수정하고 Create commit… 버튼을 클릭합니다.
stages:
- lint
variables:
LC_ALL: 'ko_KR.UTF-8'
LANG: 'ko_KR.UTF-8'
GIT_STRATEGY: clone
cache:
key:
files:
- Gemfile.lock
- Podfile.lock
paths:
- .bundle
- Pods
- vendor/bundle
lint:
stage: lint
before_script:
- bundle install --path vendor/bundle
- bundle exec fastlane pod_install
script:
- bundle exec fastlane lint
tags:
- ios -
Commit to main branch
을 선택하고, Commit Message에Add lint job
을 입력한 후, Commit 버튼을 클릭합니다. -
프로젝트 아이콘(Go to project)을 클릭하여 프로젝트 페이지로 이동한 후, 프로젝트 사이드 바에서 CI/CD를 선택합니다.
-
실행 중인 파이프라인을 클릭하면,
lint
Job이 실행되는 것을 확인할 수 있습니다. -
lint
Job을 클릭하면 로그를 확인할 수 있습니다.
Test job 추가
fastlane/Fastfile
파일에 단위 테스트 또는 UI 테스트를 수행하는 Test Lane이 정의되어 있습니다. 이 Test Lane을 실행하는 test
Job을 추가합니다.
-
Terminal 또는 iTerm에서
git pull
명령을 실행하여 원격 저장소의 변경사항을 가져옵니다. -
lint
Job은 Feature 브랜치에서만 실행되도록rules
키워드를 추가하고,stages
에test
단계,test
Job을 아래와 같이.gitlab-ci.yml
파일에 추가합니다.stages:
- lint
- test
---
lint:
stage: lint
before_script:
- bundle install --path vendor/bundle
- bundle exec fastlane pod_install
script:
- bundle exec fastlane lint
rules:
- if: $CI_COMMIT_REF_NAME =~ /feature/
tags:
- ios
test:
stage: test
script:
- bundle exec fastlane tests
artifacts:
paths:
- fastlane/test_output
tags:
- ios -
git status
명령을 실행하여 커밋할 파일 목록을 확인합니다. -
변경사항을 커밋하고 Push 합니다.
git add .
git commit -m "Add test job"
git push -
GitLab 프로젝트의 CI/CD 메뉴에서 파이프라인이 실행되는 것을 확인합니다.
GitLab CI/CD 변수 등록
GitLab CI/CD 변수는 환경 변수의 한 유형입니다. 이를 사용하여 다음을 수행할 수 있습니다.
- Job 및 파이프라인의 동작을 제어
- 재사용하려는 값을 저장
.gitlab-ci.yml
파일에 값을 하드 코딩하는 것을 방지
GitLab CI/CD에는 파이프라인 구성 및 Job 스크립트에서 사용할 수 있는 미리 정의된 CI/CD 변수의 기본 세트가 있습니다.
GitLab 리포지토리에 저장된 인증서와 프로파일을 가져와서 match
를 사용하여 코드 사이닝 하고, TestFlight 또는 App Store에 배포하는 CI/CD 파이프라인을 구성하기 위해 필요한 환경 변수를 추가합니다.
- GitLab 프로젝트의 Settings > CI/CD로 이동하여 Variables 섹션을 확장합니다.
- Add Variable 버튼을 클릭하여 아래 CI/CD 변수의 Key와 Value를 입력하고 추가합니다.
- API_ISSUER_ID : App Store Connect API 키의 Issuer ID
- API_KEY_ID : App Store Connect API 키의 Key ID
- API_KEY_CONTENT : App Store Connect API 키의 개인 API 키 파일의 내용 (
----BEGIN PRIVATE KEY---—
로 시작해서----END PRIVATE KEY-----
로 끝나는 내용 전체) - MATCH_PASSWORD : 이전 단계에서
match appstore
명령 실행 시 입력했던 Passphrase 값 - MATCH_GIT_BASIC_AUTHORIZATION : 생성한 Git 인증 Base64 키
- TEMP_KEYCHAIN_NAME : 인증서를 임시로 저장할 키체인 액세스의 이름 (예 :
fastlane
) - TEMP_KEYCHAIN_PASSWORD : 임시로 저장할 키체인 액세스의 패스워드 (예 :
abcd1234
)
TestFlight 배포 job 추가
fastlane/Fastfile
파일에 임시 키체인 생성, 코드 사이닝, 빌드번호를 증가시키고 iOS 앱을 빌드한 후, TestFlight에 앱을 배포하는 TestFlight Lane이 정의되어 있습니다. TestFlight Lane을 실행하는 distribute_testflight
Job을 추가합니다.
-
git pull
명령을 실행하여 원격 저장소의 변경사항을 가져옵니다. -
test
Job은 Merge Request 이벤트에서만 실행되도록rules
키워드를 추가하고,stages
에distribute
단계,distribute_testflight
Job을 아래와 같이.gitlab-ci.yml
파일에 추가합니다.stages:
- lint
- test
- distribute
---
test:
stage: test
script:
- bundle exec fastlane tests
artifacts:
paths:
- fastlane/test_output
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
tags:
- ios
distribute_testflight:
stage: distribute
before_script:
- bundle install --path vendor/bundle
- bundle exec fastlane pod_install
script:
- bundle exec fastlane distribute_testflight
tags:
- ios -
git status
명령을 실행하여 커밋할 파일 목록을 확인합니다. -
변경사항을 커밋하고 Push 합니다.
git add .
git commit -m "Add TestFlight job"
git push -
GitLab 프로젝트의 CI/CD 메뉴에서 파이프라인이 실행되는 것을 확인합니다.
맺음말
지금까지 세 개의 GitLab과 Fastlane으로 iOS 앱 빌드 및 배포 자동화하기 시리즈의 글에서, macOS Runner를 등록하고 구성한 후, 서비스로 설치하고 시작하는 방법, Fastlane으로 Lint, Test, TestFlight 배포 등 각 단계별로 Lane을 정의하는 방법, 그리고 이를 이용하여 GitLab CI/CD 파이프라인을 구성하고 실행하는 방법을 알아보았습니다.
Fastlane과 GitLab CI/CD 파이프라인을 사용하면 iOS 앱을 개발하여 테스트, 빌드 및 배포하는 것을 자동화할 수 있어, 개발자는 새로운 기능을 개발하거나 기존 기능을 개선하는 고유의 업무에 집중할 수 있습니다.
인포그랩은 Mobile CI/CD (iOS, Android), Frontend CI/CD (React, Vue), Backend CI/CD (Java, Node.js, Python, PHP) 등 다양한 플랫폼 및 언어에 대한 CI/CD 가이드와 템플릿을 제공합니다.
GitLab과 GitLab CI/CD 파이프라인 구성 관련하여 지원이 필요하시면 문의하기 로 연락 주십시오.