Fastlane 가이드

Posted on 2022-03-21 by GKSRUDTN99
Swift&Xcode Xcode Fastlane

Fastlane 설치

gem1을 이용해 fastlane을 설치합니다.

$ sudo gem install fastlane

❗️기기에 설치된 Ruby의 버전이 2.5.0 이상이어야 정상적으로 설치됩니다.
설치에 어려움이 있다면 ruby -v를 통해 Ruby 버전을 확인한 뒤,
2.5.0 이하의 버전이라면 Ruby 버전 업데이트 방법을 통해 Ruby를 새로 설치해주세요.

설치가 완료된 뒤, fastlane을 적용할 프로젝트 파일이 있는 경로에서 아래 명령을 사용합니다.

$ fastlane init

대부분의 경우 TestFlight 배포 -> 테스트 및 QA -> App Store 배포의 과정을 거치므로 2를 입력한 뒤 진행합니다.

Scheme을 선택하라고 하는데, 후에 Fastfile을 수정하며 두 Scheme모두 사용가능하도록 수정할 것이므로 아무거나 입력한 뒤 진행합니다.

Apple 계정의 이메일을 입력하고 진행합니다.

적용할 프로젝트의 팀명에 맞는 번호를 입력하고 진행합니다.

이전과 동일하게 프로젝트의 팀명에 맞는 번호를 입력하고 진행합니다.

Fastlane의 사용방법에 대한 설명이 나오는데, 엔터를 누르면 계속 진행됩니다.

프로젝트 폴더에 fastlane이라는 새로운 디렉토리가 생깁니다.

또한 해당 폴더 내에 FastfileAppfile이 잘 만들어졌다면 다음 단계로 진행하시면 됩니다.



Appfile 수정


위 단계를 진행하게 되면 Appfile에 방금 입력한 app identifierapple_id가 들어있는데,

app_identifier를 지우고,

이 Appfile은 다른 팀원들도 사용할 수 있으므로 apple_id를 나중에 만들 .env파일에 의존하게 만들어줍니다.

다음과 같이 수정하시면 됩니다.

apple_id(ENV["APPLE_ID"]) # Apple ID

itc_team_id("123456789") # App Store Connect Team ID
team_id("ABCABC1234") # Developer Portal Team ID

# For more information about the Appfile, see:
#     https://docs.fastlane.tools/advanced/#appfile


App Specific Password 발급 및 .env 파일 생성

Apple Id 관리 페이지에서 로그인 한 뒤 하단의 앱 암호를 클릭합니다.

우측의 + 버튼을 클릭합니다.

앱 암호의 이름을 지정하는 화면입니다. fastlaneAppPassword 등의 이름을 입력하고 생성 버튼을 클릭합니다.

Apple ID의 비밀번호를 입력합니다.

이후 나오는 앱 암호를 복사하여 저장해둡니다.



.env 파일 생성


fastlane을 사용할 때 Apple Id나 Password, App Specefic Password를 물어보는데,

이를 프로젝트의 fastlane 폴더내에 .env라는 파일을 만들고, 미리 넣어두면

fastlane 실행 중에 해당 내용을 .env에서 가져와 사용자에게 터미널에서 입력받지 않고 자동으로 진행됩니다.

현재 사용중인 .env 파일의 예시입니다.

APPLE_ID=example@test.com
FASTLANE_PASSWORD=password
FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD=abcd-efgh-ijkl-mnop
  • APPLE_ID: Apple Developer Account의 이메일을 입력합니다.
  • FASTLANE_PASSWORD: Apple Developer Account의 비밀번호를 입력합니다.
  • FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD: App Specific Password를 입력합니다.

❗️ .env파일은 git에 올라가지 않도록 .gitignore에 .env가 포함되어 있는지 확인해줍니다.


프로젝트 Scheme 및 Configuration 확인

fastlane 설정을 위해, 배포 및 개발중인 Scheme들이 Archive 될 때, 어떤 Build Configuration을 사용하는지 확인해야합니다.

Xcode를 열고, 상단바에서 Product > Scheme > Manage Schemes...를 클릭합니다.

배포 및 개발중인 Scheme하나를 선택한 뒤, 하단 Edit.. 버튼을 클릭합니다.

좌측 바에서 Archive 탭을 선택하고, 상단의 Build Configuration을 확인합니다.

현재 이 프로젝트의 DEV Scheme은 Archive될 때 Release DEV Configuration을 사용중인 것을 확인할 수 있습니다.

같은 방식으로, 배포할 다른 Scheme들의 Configurtion도 확인하시면 됩니다.


프로젝트 인증서 관리

fastlane match를 통해 인증서를 관리합니다.

fastlane match는 개발 및 배포용 인증서를 Git 레포지토리 안에 넣어두고, 협업 팀원들이 함께 사용할 수 있도록 합니다.

우선, 인증서들을 저장할 Git 레포지토리를 생성합니다.

레포지토리 생성이 끝났다면, Fastlane을 적용할 프로젝트 파일이 있는 경로에서 아래 명령을 사용합니다.

$ fastlane match init

어떤 형태의 저장소를 사용하는지 묻습니다. Git을 사용중이므로 1을 입력한 뒤 진행합니다.

제일 첫 단계에서 만든 레포지토리의 주소를 입력합니다.

그러고나면, 프로젝트의 fastlane 폴더 내에 Matchfile이 새로 생성된 것을 확인할 수 있습니다.



MatchFile 수정


저희 팀은 보통 TestFlight 배포 시에만 Fastlane을 통해 빌드하고,

앱 별로 Dev와 Prod Scheme을 나누어 빌드합니다.

그에 맞게 MatchFile을 수정합니다.

type을 'appstore'로 변경하고, app identifier을 주석해제 한 뒤 알맞게 넣어줍니다.



기존 인증서 삭제


fastlane match를 통해 인증서 및 profiles를 관리하기로 했다면,

앞으로는 원격 저장소에서 인증서와 profiles를 관리할 것이므로

기존에 있던 모든 개발 및 배포 인증서 및 profiles를 삭제해야 합니다..

프로젝트 파일이 있는 경로에서 아래 명령어를 입력하여 기존의 개발용 인증서를 삭제합니다.

$ fastlane match nuke development

위의 인증서와 Profiles를 삭제할 것이냐고 묻습니다. y를 입력하여 진행하시면 됩니다.

삭제가 완료되었으면, 다음은 아래 명령어를 통해 기존의 배포용 인증서들을 삭제합니다.

$ fastlane match nuke distribution

이전과 동일하게 인증서들과 Profiles를 삭제할 것이냐고 묻습니다.

y를 입력하여 진행하시면 됩니다.

❗️ fastlane match init 이후 처음으로 fastlane match 관련 기능을 수행하면 원격 저장소의 비밀번호를 물어보거나,
새 비밀번호를 무엇으로 지정할지 물어보는 경우가 있습니다.
새 레포지토리를 만든 경우라면 비밀번호를 지정한 뒤 따로 기록해둡시다.
기존 레포지토리를 사용하는 경우라면 다른 팀원에게 물어보도록 합시다!



새 인증서 생성


프로젝트 디렉토리에서 아래 명령을 통해 새 개발용 인증서와 profiles를 생성합니다.

$ fastlane match development

프로젝트 디렉토리에서 아래 명령으로 새 배포용 인증서와 profiles를 생성합니다.

$ fastlane match appstore

❗️진행 과정에서 로그인 비밀번호(맥북 비밀번호)나 Apple Id를 물어보는 경우가 있으니 알맞게 입력하며 진행하면 됩니다.

위 과정이 끝난 뒤 제일 처음에 만들었던 레포지토리에 들어가보면 인증서와 profiles가 올라가 있는 것을 확인할 수 있습니다.



Xcode 확인


Xcode에서 Profiles를 설정합니다.

Automatically manage signing을 체크 해제하고,

개발용 profile은 'match Development [app identifier]'를 사용하고,

배포용 profile은 'match Appstore [app identifier]'를 사용합니다.

참고링크



새로운 팀원 또는 새 맥북에서 개발할 때 인증서 받아오기


이전에 인증서를 저장할 깃 레포지토리를 만들어두고,

프로젝트의 Matchfile을 수정한 뒤, 인증서와 profiles를 깃 레포지토리에 올려놓은 상황이라면,

새 유저는 프로젝트 폴더에서 다음 두 명령으로 개발 및 배포 인증서와 profiles를 받아올 수 있습니다.

$ fastlane match appstore --readonly
$ fastlane match development --readonly

인증서와 profiles를 잘 받아왔다면, 이전 Xcode에서 Profiles를 알맞게 설정해줍니다.


Fastfile 편집

아래 내용을 fastlane 폴더 안에 있는 Fastfile에 붙여넣은 뒤, 단계에 따라 수정합니다.

# This file contains the fastlane.tools configuration
# You can find the documentation at https://docs.fastlane.tools
#
# For a list of all available actions, check out
#
#     https://docs.fastlane.tools/actions
#
# For a list of all available plugins, check out
#
#     https://docs.fastlane.tools/plugins/available-plugins
#

# Uncomment the line if you want fastlane to automatically update itself
# update_fastlane

default_platform(:ios)

platform :ios do
  desc "Push a new development build to TestFlight"
  lane :dev do
    sync_code_signing(
      type: "appstore",
      app_identifier: "kr.appname.dev",
      readonly: true,
      git_url: "https://github.com/githubLink.git"
    )
    build_app(
      workspace: "appname.xcworkspace",
      scheme: "appname DEV",
      configuration: "Release DEV",
      include_bitcode: true,
      include_symbols: true,
      silent: true,
      clean: true,
      export_options: {
        manageAppVersionAndBuildNumber: true
      }
    )
    increment_build_number
    upload_to_testflight(
      app_identifier: "kr.appname.dev",
      skip_waiting_for_build_processing: true
    ) 
  end

  desc "Push a new production build to TestFlight"
  lane :prod do
    sync_code_signing(
      type: "appstore",
      app_identifier: "kr.appname.prod",
      readonly: true,
      git_url: "https://github.com/githubLink.git"
    )
    build_app(
      workspace: "appname.xcworkspace", 
      scheme: "appname PROD", 
      configuration: "Release PROD",
      include_bitcode: true,
      include_symbols: true,
      silent: true,
      clean: true,
      export_options: {
        manageAppVersionAndBuildNumber: true
      }
    )
    increment_build_number
    upload_to_testflight(
      app_identifier: "kr.appname.prod",
      skip_waiting_for_build_processing: true
    ) 
  end
end
  1. sync_code_signing 명령 내의 parameter들을 수정합니다.

    • app_identifier는 lane :dev안에서는 Dev 앱의 identifier를, lane :prod 안에서는 Prod 앱의 identifier를 적습니다.

    • git_url은 dev와 prod 동일하게 인증서가 저장된 깃 레포지토리의 주소를 입력합니다.


  1. build_app 명령 내의 parameter들을 수정합니다.

    • workspace를 프로젝트 workspace 파일명과 동일하게 수정합니다.

    • scheme을 dev와 prod 각각에 맞는 scheme으로 수정합니다.

    • configuration<프로젝트 Scheme 및 Configuration 확인> 단계에서 확인한대로 각 scheme이 사용하는 configuration으로 수정합니다.


  1. upload_to_testflight 명령 내의 parameter들을 수정합니다.

    • app_identifier를 위의 sync_code_signing과 동일한 방식으로 수정합니다.

✅ 각 명령들의 동작과 parameter들에 대해 더 알고 싶을 때,
터미널에서 fastlane action [명령이름]과 같이 입력하면 해당 명령의 설명서가 출력됩니다. ex) fastlane action upload_to_testflight


배포

여기까지가 fastlane 배포 준비과정이었습니다.

프로젝트 경로에서 fastlane dev를 입력하면 Dev 버전이 배포되고,

프로젝트 경로에서 fastlane prod를 입력하면 Prod 버전이 배포됩니다.

App Specific Password를 물어보는 경우, 앞서 만든 App Specific Password를 입력하면 됩니다.





[1]: Ruby 패키지 관리자