[CI/CD] TestFlight를 올려보자

강대훈·2025년 10월 5일

CI/CD

목록 보기
1/4
post-thumbnail

최근 팀 프로젝트에서 CI/CD 를 도입하자는 얘기가 나왔습니다.

더 이상 Fastlane 공부를 미룰 수 없다고 느꼈기에.. 도입하기 전에 연습겸 Fastlane을 활용해서 TestFlight를 올려보려고 합니다.


Fastlane은 앱 빌드 및 배포 자동화를 도와주는 도구입니다. 수동으로 앱 배포를 진행할시에 매우 귀찮은 단계를 수행해야 합니다.

  • Certificate & Provisioning Profile 생성 (Auto Signing 하는 경우에는 해당 X)
  • 버전 / 빌드 번호 업데이트
  • Archive
  • App Store Connect 업로드
  • 앱 정보 (메타 데이터) 입력

Fastlane을 사용하면 이 모든 과정을 단 한 줄의 명령으로 자동화할 수 있습니다.


먼저 다운로드 방법입니다.

brew install fastlane 

다운로드가 정상적으로 진행됐으면 초기화를 진행합니다. 초기화는 프로젝트의 .xcodeproj 가 있는 뎁스에서 진행합니다.

fastlane init

다음과 같이 1 ~ 4 번 중에서 숫자를 입력하라고 나오는데, 저는 모두 수동으로 설정하기 위해서 4 번을 선택했습니다.

아마도 2 번을 선택했다면 테스트 플라이트 배포를 자동으로 도와주기 때문에 조금 더 쉽게 구성이 가능했을 거 같습니다.

초기화가 완료되면 다음과 같이 파일 및 디렉토리가 생깁니다.

  • fastlane
  • Gemfile : 필요한 라이브러리를 정의한 파일
  • Gemfile.lock : 정확한 버전을 담고있는 파일

지금 현재 중요한 디렉토리는 fastlane 입니다. 여기에는 2개의 파일이 존재합니다.

  • fastfile
  • appfile

이 파일들은 관리하는 앱 프로젝트, 애플 계정, lane 설정에 대한 내용을 담고 있습니다.


먼저 appfile을 보겠습니다.

appfile전역 변수를 설정해준다고 생각해도 무방하며, 자동으로 참조되는 파일입니다. 빌드 및 배포에 공통적으로 필요한 데이터들을 저장합니다.

사용을 하지 않아도 무방하며, lane 이 많은 경우에는 appfile을 사용하여 불필요한 코드를 줄이는 것도 좋은 방법입니다.

예를 들어 여기서 애플 아이디, Bundle ID 등을 입력해두면 자동으로 참조되는 방식입니다.

# Apple 계정 (App Store Connect)
apple_id("~~")

# 앱의 Bundle Identifier
app_identifier("~~")

# App Store Connect 팀 ID (Users and Access > Membership)
itc_team_id("~~")

# Apple Developer Team ID
team_id("~~")

다음은 fastfile입니다.

fastfile은 앱을 어떻게 자동화할지 시나리오를 작성하는 파일입니다.

fastlane의 공식 홈페이지에서 TestFlight를 올리는데 다음과 같은 작업이 필요하다고 합니다.

또 해당 작업은 fastfile에서 작성됩니다.

default_platform(:ios)

platform :ios do
  desc "빌드하고 TestFlight에 업로드" # 설명
  lane :beta do # 해당 lane의 이름
  
    increment_build_number # 1. 빌드 넘버 증가

    build_app( # 2. 앱 빌드
      scheme: "ShowMeTheGame",
      export_method: "app-store", # App Store로 배포
      clean: true, # 클린 빌드 수행

      export_options: {
        signingStyle: "automatic" # 인증서 Auto Signing 으로 수행. (수동으로 할시에 manual)
      }
    )

    upload_to_testflight( # 3. 테스트 플라이트 업로드
      changelog: "새로운 기능 및 버그 수정" # 변경 내용
    )
  end
end

빌드 넘버를 올리고, 앱을 빌드하고, 테스트 플라이트를 배포하는 과정을 진행합니다.

해당 과정을 자동화할 수 있도록 도와주는 파일이 fastfile입니다.

이제 테스트 플라이트 배포가 마무리 되면 좋겠지만, 여기서 에러가 발생했습니다.

Apple에서 보안을 강화하는 목적으로 JWT 기반 인증을 실시하여 AppStore Connect API Key가 필요합니다.

앱스토어 커넥트에서 다음과 같이 발급할 수 있습니다.

키를 발급하면 다음과 같이 키 ID, Issuer ID.p8 키 파일을 제공합니다.

이제 다시 fastfileAppStore Connect API Key을 추가하면 완성입니다.

default_platform(:ios)

platform :ios do
  desc "빌드하고 TestFlight에 업로드"
  lane :beta do # lane 이름

    increment_build_number # 1. 빌드 넘버 증가
    
    build_app( # 2. 앱 빌드
      scheme: "ShowMeTheGame",
      export_method: "app-store", # App Store로 배포
      clean: true, # 클린 빌드 수행
      export_options: { signingStyle: "automatic" } # 인증서 Auto Signing 으로 수행. (수동으로 할시에 manual)
    )
    
    # 3. AppStore Connect API Key 추가 (appfile에 추가해도 된다!)
    api_key = app_store_connect_api_key( 
      key_id: "~~",
      issuer_id: "~~",
      key_filepath: "~~", # .p8 Key를 추가합니다. (상대 경로, 절대 경로 모두 가능!)
      in_house: false
    )

    # 4. 테스트 플라이트 업로드
    upload_to_testflight( 
      api_key: api_key, # App Store Connect API Key 추가
      changelog: "새로운 기능 및 버그 수정"
    )
  end
end

실행은 lane 이름을 사용하면 되고, 아래와 같은 명령어를 입력하면 fastfile에 적힌 메소드가 순서대로 진행됩니다.

fastlane beta

CI/CD 도입에 앞서, 간단한 예제를 통해 TestFlight를 배포해봤습니다.

앞으로 남은 작업은 아래와 같습니다.

  • Match 파일 생성 및 적용
  • Github Action 연동

작업하면서 배운 내용들을 더 올려보도록 하겠습니다. 감사합니다🙂


참고자료

https://medium.com/hcleedev/ios-%EB%B0%B0%ED%8F%AC-%EC%9E%90%EB%8F%99%ED%99%94-fastlane-%EC%8B%9C%EC%9E%91%EB%B6%80%ED%84%B0-%EC%A0%81%EC%9A%A9%EA%B9%8C%EC%A7%80-3d9107cdc3b4

https://ios-development.tistory.com/1164

0개의 댓글