아카데미에서 개발을 하지 않는 팀원분들께 중간중간 만들어진 앱을 공유, 즉 QA를 위해 사용했던 방법은 이랬습니다. 아이폰을 맥북에 연결해 직접 빌드하기, 혹은 TestFlight를 이용해 내부 테스터로 초대하기 등이었죠.(그냥 제 아이폰을 주는 방법도 있었답니다) 그리고 생각보다 아이폰을 직접 연결해 빌드한다는 단순무식(?)한 방법을 자주 사용하곤 했는데, TestFlight라는 좋은 Tool을 놔두고 왜 그랬을까요?
기존 배포의 불편한 점
TestFlight는 애플이 제공하는 공식 베타 테스트 플랫폼입니다. TestFlight에 초대되었다면 누구든 베타 버전을 쉽게 받아볼 수 있죠. 하지만 TestFlight의 배포 프로세스는 생각보다 오래 걸립니다.
- Xcode 빌드 및 Archive
- 애플 서버에 업로드
- 애플 서버 내에서 유효성 검사 및 처리(이 과정은 수분에서 수십 분 이상 소요)
이 과정은 앱 크기나 환경에 따라 달라질 수 있겠지만 제 경험 상 약 20분 이상 소요됩니다. 아카이브 빌드가 되길 기다리고,,, App Store Connect 설정을 마치고,,, 업로드가 되더라도 언제 완료될지 모르는 유효성 검사를 기다려야 합니다.(이 과정이 생각보다 김,,,) 한마디로 귀찮고 비효율적인 작업이죠.
TestFlight의 배포 프로세스가 이렇게 귀찮고 꽤나 오래걸리다보니, 급한 상황에선 가장 빠르고 확실한 디바이스 연결을 통한 직접 빌드 방식을 많이 선택하게 되었습니다. 물론 이 방법은 서로 오프라인 내 같은 공간에 있어야 하다 보니 절대 좋은 방법이라고 이야기할 수는 없었습니다.(팀원과의 돈독함이 올라가는 긍정적인 효과는 있었지만 말이죠)

처음 맛본 배포 자동화
그렇게 입사 후 얼마 안 됐을 때쯤, 회사에서 QA 빌드를 뽑아야 한다 들었을 때 자연스럽게 TestFlight를 통한 배포를 생각했습니다. 하지만 그것보다 훨씬 빠르고 효과적인 방법을 사용하고 있었습니다! 터미널에 `fastlane ios dev`라고 명령하면 자동으로 배포 프로세스가 돌고 약 10분 이후 Firebase App Distribution에서 QA 빌드를 설치할 수 있다는 메일을 확인할 수 있었습니다.
사실상 제가 할 일은 터미널에 명령어만 작성하면 되는 것이었고, 시간도 TestFlight 대비 훨씬 빠르게 배포할 수 있었습니다. 그래서 오늘은 제가 맛본 자동화를 도와줄 Firebase App Distribution + Fastlane을 직접 적용해 보며 정리해 보겠습니다!
Firebase App Distribution을 통한 빠른 배포

Firebase App Distribution은 Google Firebase에서 제공하는 모바일 앱 배포 플랫폼으로 아래 주요 기능을 제공합니다.
- 크로스 플랫폼 지원(iOS 및 Android 플랫폼 관리)
- 빠른 배포(SDK를 설치할 필요 없이 신속한 온보딩, 인스턴트 앱 배포)
- CI 통합 기능 제공(fastlane 등)
- 테스터 관리
- Crashlytics 연동
이것저것 장점이 많지만 가장 중요한 기능은 아무래도 빠른 배포와 CI 통합 기능 제공입니다. 직접 사용해 보며 어떤 프로세스로 흘러가는지 살펴보겠습니다.
1. 테스터 기기 등록
우선 테스터들이 다운로드 받을 기기를 등록합니다. UUID를 통한 등록이며, 등록에 따른 시간도 소요되기 때문에 가장 먼저 추가하는 것을 권장합니다!


이렇게 테스터들의 기기 등록을 마친 후 수정된 프로비저닝 파일을 기반으로 아래 프로세스를 진행해야 정상적으로 테스터들이 앱을 다운로드 받을 수 있게 됩니다.
2. Xcode 아카이빙 및 IPA 파일 export
Firebase App Distribution에 빌드를 업로드하려면 IPA(iOS App tore Package) 파일이 필요합니다. 이를 위해 Xcode를 통해 Archive하고 IPA 파일을 export합니다.
{Version}({BuildNumber}) 형식으로 네이밍 되니 이 점을 참고해 아카이빙 전 체크하면 좋습니다!
ex) 1.5.4(1)







여기까지 진행 후 Export 하면 필요했던 IPA 파일을 확인할 수 있습니다.

3. IPA 파일 업로드
이제 export 한 IPA 파일을 Firebase App Distribution에 업로드해야 합니다. Firebase Console로 이동 후, 왼쪽 탭에서 App Distribution으로 이동합니다. 이후 IPA 파일을 드래그 앤 드롭 해 업로드합니다.



4. 테스터 추가 및 배포
이제 기본 세팅은 끝났습니다. 해당 배포를 다운 받을 테스터를 추가하고, 배포하면 개발자가 할 일은 끗!



5. 테스터 다운로드
배포가 완료되면 테스터들에게 초대 메일이 발송됩니다.

첫 초대 수락 시, 약관 동의 및 Firebase 프로필 다운로드가 필요합니다.



약관 동의 및 기기 등록까지 마무리 후 App Distribution 페이지에서 다운로드가 가능합니다. 이렇게 한번 등록해둔 테스터들은 이후 빌드부턴 바로 다운로드 할 수 있게 됩니다.

Fastlane을 통한 간단한 배포
기기 및 테스터 등록을 미리 해두었다면, 개발자가 할 일은 아카이빙 > IPA 파일 추출 > IPA 파일 업로드 순일 것입니다. 이 방식은 TestFlight 보다 빠르게 배포할 수 있지만(애플 서버를 통한 유효성 검증 과정이 생략되기 때문) 여전히 너무 귀찮은 작업이긴 합니다. 이를 해결할 수 있도록 Firebase는 Fastlane을 통한 CI 기능을 제공합니다.

Fastlane은 앱 배포 프로세스를 단순화하고 일관된 워크플로우로 통합할 수 있도록 돕는 오픈 소스 플랫폼입니다. Fastlane의 기능은 뒤에 설명할 베타 배포 자동화 이외에도 코드 서명 및 인증서 관리, 테스트 코드 실행 등 유용한 기능이 많지만 이 부분은 추후 별도의 포스팅에서 다뤄보는 것으로 하고, 오늘은 Firebase App Distribution과의 통합을 중점적으로 다뤄보겠습니다.
1. Fastlane 설치
homebrew를 통해 Fastlane을 설치합니다.
brew install fastlane
2. Fastlane 프로젝트 생성
작업 중인 디렉토리에서 아래 명령어를 실행 후, Fastlane 프로젝트를 생성합니다. 중간중간 어떤 용도로 사용할거냐는 내용들이 나오는데, 나중에 얼마든지 수정이 가능하니 적당한걸로 선택하면 됩니다!
fastlane init
3. Fastlane 플러그인 설치
이제 Firebase App Distribution 연결을 위한 플러그인을 설치합니다. 우선 Pluginfile을 만들어 어떤 플러그인을 사용할 것인지 정의해 주고,
gem 'fastlane-plugin-firebase_app_distribution'
Gemfile에서 해당 파일을 사용할 수 있도록 다음과 같이 수정합니다.
source "https://rubygems.org"
gem "fastlane"
plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile')
eval_gemfile(plugins_path) if File.exist?(plugins_path)
4. Firebase 로그인
이후 Firebase를 사용하기 위해 Firebase CLI를 설치 후 로그인 합니다.
# Firebase CLI 설치
brew install firebase-cli
# Firebase 로그인
firebase login
5. 환경 변수 파일 생성
각종 환경 변수를 관리하기 위해 `.env` 파일을 생성 후, Firebase App ID를 등록해주었습니다. Firebase에 프로젝트를 등록할 때 추가했던 `GoogleService-Info.plist` 파일의 `GOOGLE_APP_ID`를 참고해 추가할 수 있습니다.
FIREBASE_APP_ID={GOOGLE_APP_ID}
6. Fastfile 설정
이것저것 준비 과정이 길었는데 이제 본격적인 배포 커스텀입니다. 저는 아래와 같이 구현했습니다.
- `fastlane qa notes:"어쩌구저쩌구 출시노트"` 로 실행
- 날짜/시간 기반 빌드 번호 생성 ex) 1.5.4 (2510192247)
- internal 테스트 그룹에 배포
* 사내 Fastfile에선 QA 빌드 뿐만이 아닌 자동으로 버전, 커밋을 기준으로 출시노트를 작성해주는 Production 빌드 등도 사용하고 있었답니다. 각자 목적에 맞게 여러가지로 커스텀 해두면 생산성이 정말 많이 올라갈 것 같아요!
default_platform(:ios)
platform :ios do
desc "QA 빌드를 배포합니다."
lane :qa do |options|
_set_build_number_with_timestamp
_build
release_notes = _prepare_release_notes(options)
_upload_to_firebase_app_distribution(release_notes: release_notes)
end
# 날짜/시간 기반 빌드 번호 생성 (YYMMDDHHMM)
private_lane :_set_build_number_with_timestamp do
new_build_number = Time.now.strftime("%y%m%d%H%M")
increment_build_number(
xcodeproj: "poporazzi.xcodeproj",
build_number: new_build_number
)
end
# 앱 빌드
private_lane :_build do
build_app(
scheme: "poporazzi",
export_method: "development"
)
end
# 출시 노트 준비
private_lane :_prepare_release_notes do |options|
options[:notes] || "QA 빌드"
end
# Firebase App Distribution에 업로드
private_lane :_upload_to_firebase_app_distribution do |options|
firebase_app_distribution(
app: ENV["FIREBASE_APP_ID"], # .env 파일에서 관리
groups: "internal", # 테스트 그룹명
release_notes: options[:release_notes], # 출시 노트
firebase_cli_path: "/usr/local/bin/firebase"
)
end
end
7. 실행해보기
이후 만들어둔 fastlane 커맨드를 이용해 요렇게 입력해주고 기다리다보면,,,

에러가 발생하지 않는다면 아래와 같은 요약과 함께 배포가 완료된 것을 확인할 수 있습니다.

이후 테스터들은 QA 빌드를 다운받을 수 있는 메일을 출시노트와 함께 받을 수 있고, 빠른 배포 프로세스가 완성된 것을 확인할 수 있습니다!

적용 후기
이렇게 한번 적용해두니 이전 방식으로 되돌아갈 수 없을 정도로 편리하다는 생각이 들었습니다. 처음 설정 과정도 공식 문서 등을 통해 쉽게 따라할 수 있으며, Fastfile 작성 또한 생소한 Ruby 언어이나 문법이 어렵지 않아 금방 익힐 수 있고 또는 AI에게 요구사항을 부탁하면 아주 잘 써주는 것을 확인할 수 있었습니다.
팀 프로젝트에선 오늘과 같이 QA 빌드 lane을 만들어두면 제일 잘 써먹을 수 있을 것 같고, 개인 프로젝트에선 Production 빌드 lane을 만들어 하루에도 여러번 배포할 수 있는 환경을 구성해보면 어떨까 합니다.(다음 개인 프로젝트에선 꼭 써먹어 보는 걸루 🫠)
'실무 내용 내껄로 만들기' 카테고리의 다른 글
| Firebase Remote Config로 배포 없이 값 "딸깍" 바꿔주기 (0) | 2025.11.23 |
|---|---|
| Git Worktree로 브랜치 사이를 효율적으로 거닐기 (0) | 2025.09.13 |
| 무지성 Commit은 그만! Git Rebase로 깔끔하게 코드 리뷰 반영하기 (5) | 2025.09.07 |
