이번 포스팅에서는 코딩 컨벤션 체크에서부터, 단위 테스트, 코드 사이닝, 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를 선택합니다.
-
실행 중인 파이프라인을 클릭하면,
lintJob이 실행되는 것을 확인할 수 있습니다. -
lintJob을 클릭하면 로그를 확인할 수 있습니다.
Test job 추가
fastlane/Fastfile 파일에 단위 테스트 또는 UI 테스트를 수행하는 Test Lane이 정의되어 있습니다. 이 Test Lane을 실행하는 test Job을 추가합니다.
-
Terminal 또는 iTerm에서
git pull명령을 실행하여 원격 저장소의 변경사항을 가져옵니다. -
lintJob은 Feature 브랜치에서만 실행되도록rules키워드를 추가하고,stages에test단계,testJob을 아래와 같이.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명령을 실행하여 원격 저장소의 변경사항을 가져옵니다. -
testJob은 Merge Request 이벤트에서만 실행되도록rules키워드를 추가하고,stages에distribute단계,distribute_testflightJob을 아래와 같이.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 파이프라인 구성 관련하여 지원이 필요하시면 문의하기 로 연락 주십시오.