[iOS] Fastlane - CD 자동으로 앱스토어 배포하기

·2026년 3월 26일

iOS-posting

목록 보기
14/14

이번엔 Tuist에 이어서 CD를 위한 툴 fastlane에 대해서 다뤄보려고함다..!
제가 느끼기엔 최근 Ai 역량이 증가하면서 단순 기능 구현/개발이나 코딩적인 부분보다 CI/CD, Lint,Tuist 뭐 등등.. 서로 협업 과정에서 맞춰나가야하는 환경설정 같은 부분들은 완벽하게 Ai가 해주기엔 번거로운 감이 있어서, 이런 부분에 좀 더 리소스를 투입해야하는 것 같슴다..!

CD란?

CD(Continuous Deployment)를 의미함다. 귀찮은 배포 과정을 자동화한다고 이해하시면 좋을 것 같다.

그럼 여기서 같이 묶이는 CI는 또 무엇일까? CI/CD라고 묶이는 것을 종종 봐왔을 것이다.

CI란?

CI(Continuous Integration)를 의미함다. 개발자가 작업한 코드를 지속적으로 통합하면서, 빌드와 테스트를 자동으로 수행해 문제가 없는지 검증하는 과정임다.

그래서 이걸 묶어서 CI/CD 파이프라인이라고 부르는 것임다.
새로운 커밋이 올라오면 코드를 자동으로 통합하고, 빌드와 테스트를 거쳐 검증된 결과물을 실제 서비스 환경에 배포하는 전체 과정을 자동화한 흐름을 파이프라인이라고 하는 검다.


그럼 오늘의 주인공 fastlane에 대해서 알아보자..!

fastlane이란?

fastlane은 모바일 앱(iOS/Android)의 빌드, 테스트, 코드 서명, 배포까지 전 과정을 자동화해주는 오픈소스 도구임다.
반복적으로 수행해야 하는 배포 작업을 스크립트로 정의해, 한 번의 명령으로 처리할 수 있게 해주는 CD툴임다..!

사실 여기까지만 정보고 실제로 어떻게 사용하는지가 중요할 것 같은데, 설치부터 같이해보자..! 여기서는 안드로이드는 아니고 iOS기반으로 설명을 이어나갈 것임다.


설치방법

brew install fastlane

어디서 설치하든 상관은없고, 잘 설치가 되었으면, 이제 내가 적용해주고싶은 프로젝트로 가서 진행해주면 됨다.

프로젝트로 가라는게 어디까지 가라는거야?

xcodeproj가 있는 디렉토리까지 접근을 하면됨다.

ls로 현재 파일들 불러왔을때 xcodeproj가 보이면 성공! 여기에서 이제 실행해주면된다.

fastlane init

여기서 선택을 하라고 나온다.
1. 자동 스크린샷
2. 자동 TestFlight 배포
3. 자동 App Store 배포
4. 수동으로 설정하기


저는 앱스토어에 배포를 할 예정이라 3번이 맞긴한데, 어떻게 돌아가는지도모르고 자동생성하는 것은 파악하기가 어렵슴다. 처음이기도하니까 일단은 4번으로 선택해서 여러가지 설정들을 훑어보면서 설정을 해주도록 하겠슴다.
글고 iOS배포가 code sigining , scheme, bundle, appstore connect, archive/export 설정 등 살짝만 어긋나도 애매해지는 경우가 있어서 초기설정에는 manual로 틀을 잡고 필요한 것만 직접 누르는 경우가 더 이상적이라고들 함다..!

4번을 선택하고 여러번의 엔터로 승인을 해주고나니, 다음처럼 파일이 3개가 더 생겼음을 알 수 있다.

  1. fastlane
  • 사실상 본체 역할을 하는 디렉토리임다. fastlane의 자동화 로직들이 모두 이 안에 들어가며, Fastfile을 통해 어떤 작업을 자동화할지 정의하게 됨다.
  1. gemfile
  • fastlane이 Ruby 기반으로 동작하기 때문에, 실행에 필요한 Ruby 라이브러리 목록을 정의해두는 파일임다.
    의존성 버전을 고정해, 환경에 따라 다른 버전이 설치되면서 발생하는 충돌을 방지하는 역할을 함다.

2_1. gemfile.lock

  • Gemfile 기준으로 실제 설치된 라이브러리의 버전을 고정해두는 파일임다.
  • 협업 환경에서 fastlane이나 관련 라이브러리 버전이 달라지는 문제를 방지하기 위한 장치임다.
  • 이전 tuist 포스팅에서도 봤지않았슴까? 이런 협업 도구들은 버전 차이로 인한 문제가 자주 발생하기 때문에 이를 막기 위한 구조를 기본적으로 가지고 있슴다.

fastlane폴더에는

  1. Appfile
  2. fastfile
    파일이 존재함다. 파일을 하나씩 봅시다.

Appfile

# app_identifier("[[APP_IDENTIFIER]]") # The bundle identifier of your app
# apple_id("[[APPLE_ID]]") # Your Apple Developer Portal username

# For more information about the Appfile, see:
#    https://docs.fastlane.tools/advanced/#appfile

총 필요한게 3가지다.
1. app_identifier

  1. apple_id (apple Developer가입한 이메일)
  2. apple Developer portal username (https://developer.apple.com/account#MembershipDetailsCard) 여기서 멤버십 세부사항에 있다.

그래서 그냥 정직하게 저부분에 잘 기입해주면된다.

자 이러면 일단 Appfile 초기세팅은 끝!!! 다음은 fastfile파일로가자


Fastlane

default_platform(:ios)

platform :ios do
  desc "patch 버전 업 "
  lane :patch do
    increment_version_number(bump_type: "patch")
    increment_build_number
    build_and_upload
  end

  desc "minor 버전 업"
  lane :minor do
    increment_version_number(bump_type: "minor")
    increment_build_number
    build_and_upload
  end

  desc "major 버전 업"
  lane :major do
    increment_version_number(bump_type: "major")
    increment_build_number
    build_and_upload
  end

  private_lane :build_and_upload do
    gym(
      scheme: "Selectd",
      export_method: "app-store",
      clean: true
    )
    deliver(
      submit_for_review: true,
      automatic_release: true,
      skip_screenshots: true,
      skip_metadata: true
    )
  end
end

일단 기본설정을 해줬고.
하나하나 훑어보겠슴다..!

gym - 빌드 담당

  • xcode에서 아카이브를 위한 .ipa파일 생성을 자동화해주는 친구입니다.
  • 여기에서 app-store로 배포방식을 설정해줬고, 빌드할때 clean으로 캐시 지워주고 빌드하게끔 해줬다.

잠깐! ipa란?

  • iOS App Archive — iOS 앱의 설치 파일 묶음임다. 안드로이드에서 .apk 와 같은 개념이라고 보시면 됨다.

deliver - Appstore 업로드 담당

testflight면 pilot을 해야하는데, 저는 바로 Appstore에 등록하려고 deliver를 써줬습니다!

  • submit_for_review: false - 업로드 후 심사까지 자동 제출
  • automatic_release: false - 심사 통과 즉시 자동 출시
  • skip_screenshots: true - 스크린샷 업로드 건너뜀
  • skip_metadata: true - 앱 이름/설명 등 메타데이터 건너뜀

일단 기본적인 설정은 다 끝난것도 같은데.. 하나 빼먹은게 있슴다.
fastlane에 대한 별도의 암호설정이 필요함다.

https://account.apple.com/account/manage 로 접속해서

  1. 앱 암호 선택

  2. 원하는 이름으로 생성 - 저의 경우는 fastlane으로 햇슴다.

  3. 생성된 암호 잘 저장하세요..!

  4. FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD 등록
    fastlane 폴더안에 .env를 만들어서 다음과 같이 저장을 해주면 됨다!


그래서 실행을 하려면

fastlane patch


한참을 기다리고 나니..

whatsNew 텍스트가 없단다..! 이제 이걸 잘 채워주면 될 것이다.

내가 지원하고 있는 언어별로 또 다 써줘야한다. 다음 포스팅엔 아마 이걸 Skills 같은거로 자동화해서 하면 괜찮지않을까? 싶다. 현재 브랜치의 최근 커밋을 읽어서 - 각국의 언어로 whats new를 추가하는... 그런 방향?

deliver(
      submit_for_review: true,
      automatic_release: true,
      skip_screenshots: true,
      skip_metadata: true,
      release_notes: {
        "ko" => "이제 설정 탭에서 햅틱 피드백을 켜거나 끌 수 있어요.",
        "en-US" => "You can now turn haptic feedback on or off in the Settings tab.",
        "en-GB" => "You can now turn haptic feedback on or off in the Settings tab.",
        "en-AU" => "You can now turn haptic feedback on or off in the Settings tab.",
        "en-CA" => "You can now turn haptic feedback on or off in the Settings tab.",
        "ja" => "設定タブから触覚フィードバックのオン・オフを切り替えられるようになりました。",
        "zh-Hans" => "现在可以在设置页面中开启或关闭触觉反馈。",
        "zh-Hant" => "現在可以在設定頁面中開啟或關閉觸覺回饋。"
      },
      submission_information: {
        export_compliance_uses_encryption: false
      }
    )

이렇게 했는데 왜 안되나해서보니까..제가 skip_metadata: true
설정을 켜놨어서 이게 스킵은 하라했는데, 스킵하니까 WhatsNew를 못읽어서 없다하는 희안한 상황이 이어졌고,, 결국 메타데이터 스킵 설정을 false로하고 돌려주니까 이제 심사에 등록이 되었다!!!

이렇게 AppStoreConnect에 접근하지않고도 배포를 할 수 있게 되었다.

근데 여전히 아쉬운 숙제는 남아있음다.

  • metaData를 파일에서긴하지만 여전히 일일히 적어줘야한다는점.
  • screenShot는 이미 적용이 되어있어서 쉽게 피해갔다는 점 등이 있는데, 다음 포스팅때는 이걸 어떻게 자동화할 수 있을지 알아보도록 하겠슴다!

도움받은 자료

profile
기억보단 기록을

0개의 댓글