목차
티스토리 뷰
안녕하세요 🐾
제가 현재 다니는 회사에서는 앱 배포를 위한 내부 테스트 버전 관리도구로 Firebase Distribution을 사용하고 있습니다.
앱 출시를 앞둔 날이면 QA 관련 이슈를 정신없이 처리하며 앱 출시 또한 빈번하게 일어나는데요.
마지막_최종 버전, 찐_마지막_최종 버전의 굴례를 돌며 앱을 배포하다보니 배포 자동화 툴의 필요성을 느꼈고, Fastlane을 적용하고 커피 한 잔의 여유를 찾게 되었습니다. ☕️
휘발되기 직전인 iOS Fastlane 설정 관련 과정을 복기하기 위해 포스트를 작성하였습니다.
혹시나 틀린 곳이 있다면 알려주세요!
1. Setup
먼저 Fastlane 설치 전 프로젝트 디렉토리에서 터미널을 열어 아래의 명령어를 입력합니다.
xcode-select --install
fastlane은 엑스코드의 커맨드라인 툴을 이용합니다.
Fastlane 설치를 위해 아래의 명령어를 입력합니다.
# Using RubyGems
sudo gem install fastlane -NV
# Alternatively using Homebrew
brew install fastlane
fastlane 설치가 완료되었다면 관련 파일을 만들기 위해 아래의 명령어를 입력합니다.
fastlane init
1. 📸 Automate screenshots
2. 👩✈️ Automate beta distribution to TestFlight
3. 🚀 Automate App Store distribution
4. 🛠 Manual setup - manually setup your project to automate your tasks
여러 자동화 옵션을 제공합니다. 3을 입력하여 배포 자동화 설정을 진행합니다.
Setup이 완료 되었다면 프로젝트 루트 디렉토리 내 fastlane 폴더로 이동하여 환경변수 설정을 시작해봅시다!
1.1 .env
fastlane에는 기본적으로 .env 를 쓸 수 있도록 라이브러리에 포함되어있습니다.
.env 를 이용해 아래의 정보를 환경변수로 관리하려 합니다. 환경변수로 관리할 경우 다수의 인원이 Fastlane을 사용할 때
이 .env 파일만 찾아 본인의 정보에 맞게 바꾸어 주면 편리하겠죠?
APP_IDENTIFIER="[Your App Bundle Identifier]"
APPLE_ID="[Your Apple ID]"
// Firebase 앱 배포가 필요한 경우 아래의 정보까지 같이 입력
FIREBASE_APP_TOKEN="[Your Firebase App Token]"
FIREBASE_APP_ID="[Your Firebase App Id]"
- .env 파일이 보이지 않을 경우, CMD + SHIFT + . 키를 눌러 숨겨진 파일 표시
- env 파일 내에 본인의 APPLE ID로 바꿔 넣어 환경 변수로 별도 관리
저와 같은 경우엔 Firebase Distribution을 통해 테스트 앱 배포환경도 필요하기 때문에 Firebase 관련 정보를 .env에 기입하였지만 필요하지 않을 경우엔 입력하지 않아도 됩니다.
❗ FIREBASE TOKEN, ID 얻기는 목차의 2. Setup - Firebase Distribution을 참고해주세요!
1.2 Appfile
디렉토리의 Appfile을 열어 .env에 기입한 정보를 연결해줍니다.
여기서 따옴표(") 안에 들어가는 변수 이름은 .env 파일에서 입력한 Key name과 같은 값입니다.
tic_team_id는 App Store Connect Team ID,
team_id엔 Developer Pertal Team ID 값을 찾아 넣어줍니다.
app_identifier(ENV["APP_IDENTIFIER"]) # The bundle identifier of your app
apple_id(ENV["APPLE_ID"]) # Your Apple email address
itc_team_id("000000000") # App Store Connect Team ID
team_id("0000000000") # Developer Portal Team ID
# For more information about the Appfile, see:
# https://docs.fastlane.tools/advanced/#appfile
메소드들의 인자를 env 환경 변수로 연결
1.3 Fastfile
앱스토어 쪽에 앱을 배포할건지, 테스트 앱을 배포할건지 등의 특정 작업에 대한 명령은 Fastfile에서 작성해야 합니다.
아래 파일 내 lane: [작업이름]으로 시작하여 do로 끝나는 블록 구조가 보이시나요?
해당 블록 구조 내에 순차적으로 필요한 작업을 명령어로 기입해 넣는 방식입니다.
추후 완성된 블록 구조를 실행 할 때엔 터미널에서 fastlane [작업이름]을 입력하여 해당 작업을 수행하게 됩니다.
여기서 Fastfile내에 ENV["환경변수"]로 입력된 부분은 위에 입력된 ./env 파일 내의 Key로 정의된 Value를 사용한다는 것을 의미합니다.
저와 같은 경우엔 Firebase Distribution을 통해 테스트 앱을 배포하고 사내 메신저로 Teams를 사용하기 때문에 앱 배포 후 팀즈로 배포 관련 메세지를 전송하는 부분까지 입력해놓았는데요.
이를 사용하지 않는 경우라면 lane: send_teams do ~ end , lane: distribute to ~ end 블록은 사용하지 않습니다.
# Uncomment the line if you want fastlane to automatically update itself
# update_fastlane
default_platform(:ios)
platform :ios do
desc "Push a new release build to the App Store"
lane :release do # 앱스토어로 앱 배포
get_certificates
get_provisioning_profile
# cocoapods(use_bundle_exec: false)
build_app(workspace: "[APP_NAME].xcworkspace", scheme: "[APP_NAME]")
upload_to_app_store
version = get_version_number
send_teams(method:"app-store")
end
lane :send_teams do |options| #앱 배포 후 팀즈로 배포 관련 메세지 전송
version = get_version_number
build = get_build_number
case options[:method]
when "ad-hoc"
msg = "Firebase distribution - [APP_NAME]#{version}.#{build} 배포 완료되었습니다."
when "app-store"
msg = "AppStore - [APP_NAME] - #{version}.#{build} 업로드 완료되었습니다."
end
case options[:method]
when "ad-hoc"
titleMsg = "[iOS][AppDistrituion] App release complete for Version: Bello#{version}.#{build}"
when "app-store"
titleMsg = "[iOS][AppStore] App upload complete for Version: Bello#{version}.#{build}"
end
teams(
title: titleMsg,
message: msg,
theme_color: "FFFF22",
facts:[
{
"name"=>"Platform",
"value"=>"iOS"
},
{
"name"=>"Reporter",
"value"=>ENV["APPLE_ID"]
}
],
teams_url: ENV["TEAMS_WEBHOOK_URL"]
)
end
lane :distribute do #파이어베이스로 테스트 앱 배포
version = get_version_number
build = get_build_number
build_app(workspace: "[APP_NAME].xcworkspace", scheme: "[APP_NAME]", export_method: "ad-hoc")
firebase_app_distribution(
app: ENV["FIREBASE_APP_ID"],
firebase_cli_token: ENV["FIREBASE_APP_TOKEN"],
testers: "[Your Email]",
groups: "[Group Name]",
release_notes: "App release complete for Version: #{version}.#{build}"
)
send_teams(method:"ad-hoc")
end
end
get_certificates, get_provisioning_profile - 인증서, 프로비져닝 파일 가져오는 메소드입니다cocoapods(use_bundle_exec: false) - 빌드 전 pod install을 해주도록 했습니다.(현재 비활성 상태)
build_app(workspace: "[APP_NAME].xcworkspace", scheme: "[APP_NAME]") - 앱을 빌드하는 메소드 입니다.
upload_to_app_store(skip_metadata: true, skip_screenshots: true) - 빌드가 성공하면, 앱스토어에 업로드하는 메소드 입니다.
send_teams(method:"ad-hoc" or "app-store") - 배포 후 Webhook URL을 가진 특정 Teams 채널에 메세지를 전송합니다.
2. Setup - Firebase Distribution
이미 연동된 프로젝트에 새 머신에서 플러그인을 설치하려고 할 경우에, Firebase Distribution 플러그인이 깔려 있으므로, 아래 커맨드로 새 머신에서 플러그인을 설치합니다.
fastlane install_plugins
만약 처음부터 설정을 원하시는 경우엔 아래의 과정을 진행해야 합니다. iOS 프로젝트의 루트에서 다음 명령어를 실행합니다.
fastlane add_plugin firebase_app_distribution
fastlane add_plugin firebase_app_distribution
명령어 실행 이후 path 설정에 관해 물어보면 y를 입력합니다.
❗ 설치 진행이 되지 않을 경우 링크 참고
설치 이후 Firebase 인증이 필요한데, 터미널을 이용한 플러그인 로그인 방법을 수행하였습니다.
bundle exec fastlane run firebase_app_distribution_login
이 명령어는 인증 링크를 출력합니다.
출력 된 링크를 브라우저에서 열고 Google 계정에 로그인 한 뒤 결과 코드를 복사하여 터미널 명령 줄에 붙여넣습니다.
추후에 빌드 자동화 진행에서 위의 재인증 과정을 생략하기 아래의 과정을 통해 갱신 토큰을 환경 변수에 저장하여야 합니다.
$ curl -sL firebase.tools | bash
Install firebase tools
$ firebase login:ci
In this step you can getting `FIREBASE_APP_TOKEN`
출력받은 FIREBASE_APP_TOKEN을 .env 파일에 입력
※ 작성된 Fastfile 내 lane: distribute do 블록 참고하시면 됩니다.
3. Setup - Teams
앱 배포후 Teams를 통해 배포 관련 작업에 대한 알림 메세지를 보내고 싶을 경우 이 작업을 수행합니다.
이미 연동된 프로젝트에 새 머신에서 플러그인을 설치하려고 할 경우에, Firebase Distribution 플러그인이 깔려 있으므로, 아래 커맨드로 새 머신에서는 받아옵니다.
이전 목차인 Setup - Firebase Distribution 에서 아래의 명령을 수행하였을 경우 Setup - Teams 작업은 생략됩니다.
fastlane install_plugins
이미 설정된 Fastlane에 install_plugins를 진행하는 것이 아니라, 만약 처음부터 설정을 원하시는 경우엔 아래의 과정을 진행해야 합니다. iOS 프로젝트의 루트에서 다음 명령어를 실행합니다.
Install teams plugin
설치 완료 이후 작성된 Fastfile 내 lane :send_teams do |options| 블록 참고하시면 돕니다.
아래의 코드로 플러그인에 대한 테스트를 진행할 수 있습니다.
rake
테스트와 코드 스타일 유효성 검사를 모두 실행
rubocop -a
스타일 문제를 자동으로 수정
4. Execution
모든 Setup이 완료되었다면, 프로젝트의 루트 디렉토리에서 터미널로 아래의 명령을 통해 앱배포를 수행합니다.
// 앱스토어 앱 배포
fastlane release
// 파이어베이스 앱 배포
fastlane distribute
5. 참고
'iOS > System' 카테고리의 다른 글
[iOS] Framework와 CPU Architecture에 대한 고찰 (0) | 2023.05.22 |
---|---|
[iOS] Firebase Distribution을 통한 앱 배포 (1) | 2023.05.17 |
[iOS] iOS앱에 Firebase 추가하기 (0) | 2023.04.28 |
[iOS] SwiftGen 적용하기 (0) | 2023.04.02 |
[iOS] CocoaPod Private Pod 생성 및 배포 (2) | 2023.03.30 |
- Total
- Today
- Yesterday
- ios google signin
- swift google signin
- swift 구글 로그인
- iOS 단위테스트
- ios mvvm
- iOS 테스트 코드
- iOS 유닛테스트
- ios xcframework
- ios google
- swift google login
- ios reactorkit
- swift 구글 sdk
- Firebase Distribution
- iOS Framework
- swift xctest
- swift framework
- swift reactorkit
- swift google sdk
- XCFramework
- XCTest
- Quick
- nimble
- ios 구글 로그인 sdk
- swift quick
- swift nimble
- Framework
- iOS Unit Tes
- iOS Quick
- swift google login sdk
- iOS Nimble
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |