app_identifier(ENV["APP_IDENTIFIER"]) # The bundle identifier of your app
apple_id(ENV["APPLE_ID"]) # Your Apple Developer Portal username
Fastfile
실제 커맨드 명령들을 만드는 파일이다.
# Uncomment the line if you want fastlane to automatically update itself
# update_fastlane
default_platform(:ios)
platform :ios do
desc "Push a new beta build to TestFlight"
lane :beta do
# ✅ 자동으로 빌드 넘버를 증가
increment_build_number(xcodeproj: "xxxx.xcodeproj")
# ✅ 빌드할 워크스페이스와 빌드 스키마 지정
build_app(workspace: "xxxx.xcworkspace", scheme: "xxxx")
# ✅ TestFlight 업로드
upload_to_testflight(
# ✅ 업로드 후에 App Store Connect 에 올라가기 전까지 시간이 걸리는데 이걸 기다리고 싶지 않다면 true 로 설정.
skip_waiting_for_build_processing: true
)
slack(
message: "Testflight 배포 성공",
channel: "#r_frontend_deploy",
slack_url: ENV["SLACK_WEBHOOK_URL"],
)
end
error do |lane, exception, options|
slack(
message: "에러 발생 : #{exception}",
success: false,
slack_url: ENV["SLACK_WEBHOOK_URL"],
)
end
end
SLACK_WEBHOOK_URL 설정
Slack에서 원하는 채널을 선택해서 Webhook을 설정하고, 해당 url을 통해서 요청을 보내면 해당 메세지가 전달되는 방식이다.
버전 0.5.0에서 부터는 firebase_app_distribution_login이 deprecated가 되고, firebase CLI를 설치 해야한다고 한다.
# Firebase CLI를 전역적으로 설치한다.
$ npm install -g firebase-tools
# 설치 후 Firebase 계정에 로그인한다.
$ firebase login
위 단계를 완료하면 Firebase CLI를 사용하여 Firbase App Distribution과 같은 다른 Firebase 서비스를 사용할 수 있다.
Fastfile
##########################################
########## Firebase Distribution #########
##########################################
buildDir = "./build"
lane :firebase do
firebase_app_distribution(
app: ENV["FIREBASE_APP_ID"],
# 그룹명은 firebase에 있는 group alias를 사용해야한다.
groups: "tester_groups",
debug: true
)
slack(
message: "App Distribution 업로드 성공",
# 해당 slack 채널명 사용
channel: "#r_frontend_deploy",
# iOS에서도 사용했던 웹 훅을 연결해준다. android도 .env 파일을 만들어줄 것
slack_url: ENV["SLACK_WEBHOOK_URL"],
)
end
error do |lane, exception, options|
slack(
message: "에러 발생 : #{exception}",
success: false,
slack_url: ENV["SLACK_WEBHOOK_URL"],
)
end
+) 추가적으로 App Store 배포까지 해보자
desc "Deploy a new version to the Google Play"
lane :playStore do
releaseFilePath = File.join(Dir.pwd, "my-release-key.keystore")
gradle(task: "clean")
gradle(
task: 'bundle',
build_type: 'Release',
properties: {
"android.injected.signing.store.file" => releaseFilePath,
"android.injected.signing.store.password" => ENV["STORE_PASSWORD"],
"android.injected.signing.key.alias" => ENV["KEY_ALIAS"],
"android.injected.signing.key.password" => ENV["KEY_PASSWORD"]
}
)
upload_to_play_store(
track: 'production',
release_status: 'draft',
)
slack(
message: "Google Play Store 업로드 성공",
channel: "#r_frontend_deploy",
slack_url: ENV["SLACK_WEBHOOK_URL"],
)
end
releaseFilePath도 ./env 파일 내에 관리해도 된다. 현재는 /fastlane 파일 안에 my-release-key.keystore를 저장해줬는데 두 번 저장되는 꼴이 되기 때문에 경로를 잘 설정하면 될 것 같다!
후기
그동안 하던 스프린트가 마치고, 시간이 남아 자동화 배포까지 적용 해보았다. 처음에는 낯설었던 fastlane이 에러 코드만 보고도 어떤 부분이 문제인지 알 수 있을 정도로 익숙해졌다.
fastlane 자동화 시스템을 갖추는 데까지는 1~2일 소요되지만, 정말 업무 생산성을 높일 수 있는 시스템인 것 같다. action으로 버전과 빌드 번호를 증가시키고 슬랙에도 푸시할 수 있으니 얼마나 편리한가 …!