Fastlane을 통해 배포를 자동화 시켜보자

김동현·2022년 9월 11일
0

iOS

목록 보기
12/13
post-thumbnail



앱을 릴리즈하기 위해서는 약간의 절차가 필요합니다.
Xcode에서 아카이브 진행 후 완료될때까지 기다렸다가
버튼 하나씩 눌러 가면서 AppstoreConnect에 업로드 하는 귀찮음이 도사리고 있죠.
이러한 수고로움은 자동화 시스템 도입으로 덜어줄 수가 있는데요.
바로 Fastlane이 그 역할을 해줍니다.
오늘은 개인 비서같은 이 Fastlane이라는 녀석을
프로젝트에 적용시키는 방법에 대해서 소개해보려 합니다.

먼저 Fastlane 세팅 작업을 위해서
Xcode 커맨드 라인 툴을 설치 하도록 하겠습니다.

xcode-select --install


그리고 Fastlane을 install 하고

sudo gem install fastlane


아래 명령어를 입력 후 나온 로그중
버전이 현재 최신 버전과 동일한지 확인을 해보겠습니다.

fastlane env


Fastlane 레포에 들어가서 최신 버전 확인을 해보니,
2.195 였어요!
sudo gem install fastlane 으로 진행했을 때
최신 버전으로 바로 install 되었습니다.
(만약 버전이 동일하지 않다면 update를 해야합니다.)
그다음 fastlane init을 진행하면
아래와 같이 4가지 선택을 할 수 있는 로그가 뜨게 됩니다.

fastlane init


앱스토어 커넥트에 업로드 + 테스트 플라이트 자동화를 적용시킬 것이기 때문에,
3번을 선택하도록 하겠습니다.
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를 true로 설정했을 때
터미널에서 수동으로 일일이 엔터 작업을 누르는 것과 같은 작업을
자동화 시켜줄 수 있습니다.

automatic_release는 심사 완료 후 자동 출시에 대한 여부 값입니다.

skip_screenshots
지금 Appstore Connect에 업로드 되어있는 스크린샷을
그대로 사용할 것인지에 대한 값이며, 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 형식으로 기입하면 됩니다.
이번 release에 반영될 수정사항을 기입하고 싶은 경우,
release_notes 파일에 저장시켜 놓으면 됩니다.


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 연동은
Web_Hook_URl 설정하기를 통행 진행하시면 됩니다.
위 링크로 이동하셔서 알림을 받고자 하는 채널을 선택하시고
url을 취득할 수 있는데요!
해당 url을 slack_url: "https://hooks.slack.com/........",
과 같이 입력해주면 됩니다.

이제 대망의 fastlane release를 실행할 차례입니다.
fastlane release 명령어를 입력한 후 막바지 정도에 앱 암호를 입력하라는 로그가 나오게 되는데요.
하단 링크로 접속해서 암호를 생성하고 붙여 넣으면 됩니다.
암호 생성하러 가기
앗.. 기대감을 가지고 기다리던중 에러가 발생했네요..
로그를 읽어보니 버전을 올리지 않고 진행해서 발생한 것으로 확인되었습니다.
버전업 시킨후 다시 fastlane release!
이제 Appstore connect에 접속해서 업로드가 정상적으로 완료되었는지 확인해 볼까요?
해당 버전이 잘 올라와 있으며 Metadata에서 release_note에
작성했었던 텍스트도 정상적으로 입력 되어있는 것을 볼 수 있었습니다.


TestFlight


추가적으로 Testflight에 배포하기 위해서는 아래와 같이 beta라는 lane을 추가해서
fastlane beta 라고 터미널에서 명령어를 입력하면 됩니다.
fastlane releases를 진행했던 방법과 동일하게요!

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에서 확인을 해보면
Testflight에 업로드 되어 있는 것도 확인 할 수 있습니다.🙌

profile
iOS 개발자 김동현입니다 :)

0개의 댓글