최근 개인 프로젝트에 Fastlane을 도입하여 배포하는 과정의 수고를 덜어주는 자동화 시스템을 구현 했다.
해당 툴을 사용하면 일일이 Xcode에서 빌드 넘버 올리고 아카이브하고 기다렸다가 버튼 누루면서 업로드 하는 등 그러한 행위 없이
Fastlane 하나로 단순화 시켜 배포를 진행할 수 있다.
그리하여 Fastlane 툴을 프로젝트에 도입하는 방법에에 대해 소개하겠다.
먼저 Fastlane 세팅 작업을 위한 Xcode 커맨드 라인 툴을 설치 하도록 하겠다.
xcode-select --install
그리고 Fastlane을 install 하고
sudo gem install fastlane
아래 명령어를 입력 후 나온 로그중 버전이 현재 최신 버전과 동일한지 확인한다.
필자는 Fastlane 레포에 들어가서 최신 버전 확인을 하였고
sudo gem install fastlane 으로 진행했을때 최신 버전으로 바로 install 되었다.(만약 버전이 동일하지 않다면 update를 해야한다.)
fastlane env
그다음 fastlane init을 진행하면 아래와 같이 4가지의 선택을 할 수 있는 로그가 뜨는데
이번 포스팅에서는 앱스토어 커넥트까지 업로드 + 테스트 플라이트 자동화를 소개할것이다.
3번을 선택한 후
fastlane init
Apple ID Username을 작성하라고 하는데 Apple ID(email)을 작성해주겠다.
그다음 Fastlane에서 앱의 메타데이터를 관리하도록 할것이냐고 물어본다.
y를 선택하면 fastlane이 기존 메타데이터와 스크린샷을 다운로드한다.
동시에 로컬 `.txt` 파일에서 앱의 메타데이터를 편집할 수 있고
fastlane을 실행하면 메타데이터 변경 사항이 푸시된다.
y를 선택하고나서 엔터를 몇번 쳐주면 Fastlane init 작업은 끝이난다.
그리고나서 다음과 같이 새로운 디렉토리와 파일이 생성되어 있는걸 확인할 수 있을 것이다.
Fastfile
여기서 Fastfile을 먼저 알아보자면
Fastlane에서 진행 할 기능들을 정의 해놓은 파일이다.
즉 Fastlane을 통해 release를 실행 했을때
인증서 관리, 빌드, 업로드 등 여러가지 기능을 수행하는 작업 리스트가 담겨있다고 보면 될 것 같다.
Fastfile을 열어보면 아래와 같이 로직이 존재하고 있는데
lane: release 가 방금 말한 실행 사항에 해당한다.
default_platform(:ios)
platform :ios do
desc "Push a new release build to the App Store"
lane :release do
increment_build_number(xcodeproj: "DDareungMap.xcodeproj")
build_app(workspace: "DDareungMap.xcworkspace", scheme: "DDareungMap")
upload_to_app_store
end
end
그래서 그 release를 수정해보자면 아래와 같은데
default_platform(:ios)
platform :ios do
desc "Push a new release build to the App Store"
lane :release do
get_certificates
get_provisioning_profile
increment_build_number(xcodeproj: "DDareungMap.xcodeproj")
build_app(workspace: "DDareungMap.xcworkspace", scheme: "DDareungMap")
upload_to_app_store(
app_version: "2.0.1",
submit_for_review: false,
force: true,
automatic_release: true,
skip_screenshots: true,
skip_metadata: false
)
end
end
먼저 get_certificates, get_provisioning_profile 같은 경우는
인증서, 프로비져닝 파일 가져오는 메소드이며 현재 Fastlane을 실행 할 맥북의 배포 관련 인증서가 있어야 한다.
build_app(... 은 앱을 빌드하는 과정.
upload_to_app_store(... 는 설정한 인자값에 따라 appstore에 업로드 하는 작업이다.
- app_version에는 업로드 할 app_version을 명시해주고
- submit_for_review에는 빌드 업로드 후 심사를 위한 제출까지 할것인가의 값이다.(지금은 앱스토어 커넥트 업로드 까지의 자동화를 진행할것이라 false로 지정했다.)
- force는 터미널에서 수동으로 엔터 작업과 같은 작업 없이 바로 진행하도록 하는것이다.
- automatic_release는 심사 완료 후 자동 출시에 대한 여부를 물어보는것이다.
- skip_screenshots은 지금 업로드 되어있는 스크린샷을 그대로 사용할것이기 때문에 skip으로 진행하겠다.
- skip_metadata는 업데이트 되는 버전의 변경사항, 버그 수정 사항을 기입 할 것이기 때문에 false로 진행하겠다.
Appfile
그다음은 Appfile에 대해서 알아보겠다.
메소드들의 인자에 자동으로 값이 할당되어있는게 보일것이다.
Fastlane은 Appfile에 작성된 이 메소드들의 내용을 보고 설정을 마친후 Fastfile을 통해 lane내부의 로직들을 수행한다.
app_identifier("BundleID") # The bundle identifier of your app
apple_id("AppleID") # Your Apple email address
itc_team_id("itc_team_id") # App Store Connect Team ID
team_id("team_id") # Developer Portal Team ID
Deliverfile
Deliverfile은 정확히 파악하지 못했지만 아래와 같은 메타데이터의 성격이랑 비슷한 정보들을 담고 있는것으로 보이며
이 정보들 외에도 다른 데이터를 추가할 수 있는것으로 예상된다.
# 가격 정보
price_tier(0)
# 3party콘텐츠, IDFA 포함 여부 설정
submission_information({
export_compliance_encryption_updated: false,
export_compliance_uses_encryption: false,
content_rights_contains_third_party_content: false,
add_id_info_uses_idfa: false
})
MetaData
Metadata같은 경우 반영하고자 하는 수정 사항을 txt 형식으로 기입하면 된다.
예를 들어 AppStore에서 노출되는 이번 릴리즈에 반영될 수정사항을
release_notes에 위와같이 명시해놓고
이따 업로드 완료후 Appstore connect에서 확인해보겠다.
Slack
마지막으로 fastlane을 실행 결괏값을 받아 볼 수 있는 slack과의 연동 작업을 진행하겠다.
Fastfile로 돌아가서 적절한 인자값을 사용하여 slack 메소드를 호출해주면 된다.
default_platform(:ios)
platform :ios do
desc "Push a new release build to the App Store"
lane :release do
get_certificates
get_provisioning_profile
increment_build_number(xcodeproj: "DDareungMap.xcodeproj")
build_app(workspace: "DDareungMap.xcworkspace", scheme: "DDareungMap")
upload_to_app_store(
app_version: "2.0.1",
submit_for_review: false,
force: true,
automatic_release: true,
skip_screenshots: true,
skip_metadata: false
)
version = get_version_number
slack(
message: "🚀 Complete 🚀",
channel: "#ddareungmap",
slack_url: "https://hooks.slack.com/services/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",
success: true,
payload: {
"version": version
}
)
end
error do |lane, exception, options|
version = get_version_number
slack(
message: "😡 Error 😡 Description - " + exception.message,
channel: "#ddareungmap",
slack_url: "https://hooks.slack.com/services/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",
success: false,
payload: {
"version": version
}
)
end
end
slack 연동은
https://ddareungmap.slack.com/apps/new/A0F7XDUAZ--
위 링크에 접속해서
채널을 선택한 후 url을 취득할 수 있는데
해당 url을 slack_url: "https://hooks.slack.com/........",
과 같이 입력해주면 된다.
이제 대망의 fastlane release를 실행할 차례.
release 막바지 정도에 앱 암호를 입력하라는 로그가 나오면 하단 링크로 접속해서 암호를 생성하고 붙여 넣으면 된다.
https://appleid.apple.com/account/manage
기대감을 가지고 기다리던중 에러가 발생했다.
버전을 올려 명시 하지 않아 발생했다.
버전업 시킨후 다시 release!
이제 Appstore connect에 접속해서 업로드가 정상적으로 완료되었는지 확인해보겠다.
해당 버전이 잘 올라와 있으며 Metadata에서 release_note에 작성했었던 텍스트도 정상적으로 입력되어있는것을 볼 수 있다.
빌드 넘버 또한 알아서 1씩 증가하여 업로드 시켜준걸 확인할 수 있다!
TestFlight
testflight으로 배포하기 위해서는 아래와 같이 beta라는 lane을 추가하여
fastlane beta 라고 터미널에서 명령어를 입력하면 된다.
lane :beta do
get_certificates
get_provisioning_profile
increment_build_number(xcodeproj: "DDareungMap.xcodeproj")
build_app(workspace: "DDareungMap.xcworkspace", scheme: "DDareungMap")
upload_to_testflight
end
업로드를 마치면 보기만 해도 뿌듯한 로그를 보내온다.
Appstore Connect에서 확인을 해보면 테스트플라이트에 업로드 되어 있는걸 확인 할 수 있다.
또한 해당 테스트 그룹에 포함 되어 있는 테스트 유저가 있었다면
해당 유저에게 테스트플라이트 업로드 푸시가 전송된다.
Fastlane에는 위에서 다룬 내용 외에도 배포에 있어 다양한 자동화를 지원 해주는 것 같다.
그부분에 대해서는 필요에 따라서 추가적으로 공부하고 다시 포스팅을 해야겠다.
'IOS' 카테고리의 다른 글
[IOS] Unit Test (0) | 2022.07.24 |
---|---|
[IOS] Submodule 설정 (0) | 2022.02.05 |
[IOS] TableView (with xib) (0) | 2021.02.21 |
[IOS] TableView (with Storyboard) (0) | 2021.02.21 |
[IOS] TableView (with Code) (0) | 2021.02.20 |