iOS 앱 배포 자동화를 위한 GitLab CI/CD 구성

이번 포스팅에서는 코딩 컨벤션 체크에서부터, 단위 테스트, 코드 사이닝, 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… 버튼을 클릭합니다.
yamlstages: - 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파일에 추가합니다.yamlstages: - 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 합니다.
bashgit 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파일에 추가합니다.yamlstages: - 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 합니다.
bashgit 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 파이프라인 구성 관련하여 지원이 필요하시면 문의하기 로 연락 주십시오.
사전 동의 없이 2차 가공 및 영리적인 이용을 금하며, 온·오프라인에 무단 전재 또는 유포할 수 없습니다.
Jason
DevOps Architect
인포그랩에서 DevOps 아키텍트로 활동하며, 다양한 산업군의 엔터프라이즈 프로젝트를 리딩하고 있습니다. GitLab·Kubernetes·AWS·Azure 기반 인프라 설계와 운영을 담당하며, Air-gapped 환경 CI/CD 파이프라인 구축과 클라우드 네이티브 보안 아키텍처 설계에 전문성을 보유하고 있습니다. 온프레미스 Kubernetes Observability 플랫폼 설계 경험을 포함해 Prometheus·Grafana·Mimir·Loki·OpenTelemetry 등 오픈소스 Observability 스택과 Helm 기반 배포 자동화, n8n 워크플로우 자동화에 폭넓은 실무 경험을 갖췄습니다. Claude Code·커스텀 Skill 개발·MCP·Agentic AI 등 최신 AI 엔지니어링 트렌드를 DevOps 워크플로우에 적극 접목하며, 문제 정의부터 아키텍처 설계·딜리버리까지 프로젝트 전 주기를 주도합니다.
이 저자의 글 모두 보기 →DevOps 도입이 필요하신가요?
인포그랩 전문가가 맞춤 을 도와드립니다.
관련 글

AWS EC2 Mac 인스턴스에 GitLab Runner 설치하기
iOS 앱을 개발하면서 코드사이닝, 버전 및 빌드 번호 변경, 테스트하여 TestFlight 및 App Store에 배포하는 일련의 과정은 번거로운 작업일 수 있습니다. Fastlane과 GitLab CI/CD 파이프라인을 사용하면 이러한 작업을 자동화할 수 있습니다. 개발자는 새로운 기능을 개발하거나 기존 기능을 개선한 후, 코드를 커밋하고 GitLab에 Push만 하면 됩니다. GitLab CI/CD 파이프라인이 개발자를 대신해 자동으로 빌드, 테스트하고 TestFlight 및 App Store에 앱을 배포하는 과정을 상세하게 알 수 있음
2022년 5월 31일

iOS 앱 배포 자동화를 위한 Fastlane 설치 및 구성
Fastlane을 사용하면 스크린샷 생성, 코드사이닝, 빌드 번호 올리기, 애플리케이션 릴리스와 같은 개발 및 릴리스 워크플로의 모든 지루한 작업을 자동화할 수 있습니다. GitLab CI/CD 파이프라인을 사용하면 Fastlane으로 구성한 이러한 작업을 Git 브랜치 전략에 따라 자동으로 실행합니다. 이 글을 통해 Fastlane을 설치하고 기본 설정을 한 후, 필요한 환경 변수를 추가하고 각 단계별 Lane을 정의하는 방법과 `match` 방식으로 코드 사이닝 하는 과정을 상세하게 알 수 있습니다.
2022년 6월 27일

GitLab CI/CD 캐시\:\ 파이프라인 속도 향상하기
GitLab의 중요한 기능 중 하나는 코드 빌드, 테스트 및 배포 과정을 자동화할 수 있는 CI/CD 파이프라인입니다. 그러나 프로젝트가 커지면 Job 수, 단계 수, 스크립트 및 의존성 수 등 많은 요소로 인해 파이프라인이 느려질 수 있습니다. 느린 파이프라인은 개발 프로세스에 부정적인 영향을 미칠 수 있으며, 시장 진입 시간이 증가하고 귀중한 자원을 낭비할 수 있습니다. 이번 포스트에서는 GitLab 파이프라인 속도를 향상하는 데 사용할 수 있는 여러 방법과 그중 가장 간단하고 효과적인 방법인 GitLab CI/CD 캐시에 대해 알아보겠습니다.
2023년 2월 27일