이번 포스팅에서는 코딩 컨벤션 체크에서부터, 단위 테스트, 코드 사이닝, 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 | 인포그랩 GitLab

사용 가능한 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 키워드를 추가하고, stagestest 단계, 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)
GitLab CI/CD Variables | 인포그랩 GitLab

TestFlight 배포 job 추가

fastlane/Fastfile 파일에 임시 키체인 생성, 코드 사이닝, 빌드번호를 증가시키고 iOS 앱을 빌드한 후, TestFlight에 앱을 배포하는 TestFlight Lane이 정의되어 있습니다. TestFlight Lane을 실행하는 distribute_testflight Job을 추가합니다.

  • git pull 명령을 실행하여 원격 저장소의 변경사항을 가져옵니다.

  • test Job은 Merge Request 이벤트에서만 실행되도록 rules 키워드를 추가하고, stagesdistribute 단계, 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 파이프라인 구성 관련하여 지원이 필요하시면 문의하기 로 연락 주십시오.