[Fastlane] Fastlane을 통해 빌드를 자동화하자 1편

[Fastlane] Fastlane을 통해 빌드를 자동화하자 1편

이채현

노션으로 보기

What is the Fastlane?

  • ruby 코드로 만들어진 앱 배포 자동화 툴
  • 커맨드라인으로 빌드 할 수 있음
  • CI 시스템과의 통합 용이
  • 여러 구성원이 App Store에 앱을 배포하거나 단일 장치에 앱을 설치할 때 별도의 코드 서명 ID가 필요하지만, fastlane의 match를 사용하여 하나의 중앙저장소를 만들 수 있음
    • 기존 배포 인증서는 팀원 각각 만들어야 하고, 만료 기한이 있었던 것과 달리 깃 저장소에 저장된 배포 인증서로 사용 가능
    • 단, 이중인증 필요하다는 한계 존재

Run Fastlane

01. setting

fastlane 설치 및 세팅

#1. Install the latest Xcode command line tools

1
xcode-select --install

#2. ruby 2.5.0이상 버전 다운로드 필요

  • Homebrew를 이용한 설치

  • macOS Sierra 기준으로, 맥에는 이미 ruby가 설치되어 있음

  • 기본설치 되어 있는 Ruby가 오래된 버전이라면 rbenv를 다운로드 하여 버전관리를 하는 것이 좋음

    1
    brew install rbenv ruby-build
  • rbenv 초기화

  • rbenv의 설치가 완료되었다면 아래에 명령어를 실행하여 rbenv을 초기화한다.

  • 아래 명령어를 실행하면 다음과 같이 나온다

    1
    2
    3
    4
    5
    rbenv init

    ---
    # Load rbenv automatically by appending
    # the following to ~/.bashrc_profile:*eval "$(rbenv init -)"`
  • 위에 설명과 같이 .bashrc_profile 파일을 열고 아래와 같이 수정한다.

    1
    2
    3
    4
    5
    eval "$(rbenv init -)" 또는
    eval "$(rbenv init - zsh)"

    # 그리고 아래 줄을 작성한다.
    export PATH=$HOME/bin:/usr/local/bin:$PATH
    1
    source ~/.zshrc
  • 루비 2.5.0 이상 설치

    1
    2
    3
    4
    5
    rbenv install 3.1.2

    rbenv global 3.1.2 rbenv rehash

    ruby -v

#3. fastlane을 설치하는 두가지 방법

02. Init Fastlane

fastlane을 위해 사용할 폴더 구조는 다양하다. 필자는 RN 프로젝트에서 다음과 같이 사용하고 있음.

#1. 프로젝트 최상위 루트에서 init 후 아래와 같은 폴더 구조 생성

1
2
3
bundle exec fastlane init

이후 4번 선택

Untitled

Untitled

root project |_ fastlane |_ android |Fastfile | ios |Fastfile | android |_ ios

#2. Fastfile설정

1
2
3
4
5
6
7
fastlane_require 'dotenv'

before_all do
end

import("./ios/Fastfile")
import("./android/Fastfile")

#3. env 설정

  • Android와 iOS의 빌드를 위해 env를 분리시킨다.

    • 프로젝트 최상위 루트에 .env.FLAndroid, .env.FLIos 파일을 생성한다.

    env파일

    • .env.FAndroid
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # 개발

    APPCENTER_API_TOKEN={앱센터 토큰}
    APPCENTER_OWNER_NAME={"앱센터 사용자 이름"}
    APPCENTER_APP_NAME={"앱센터 앱 이름"}
    APPCENTER_DISTRIBUTE_APK="./android/app/build/outputs/apk/development/release/app-development-release.apk"

    # 상용

    JSON_KEY={"플레이스토어 API 액세스 키"}
    STORE_DISTRIBUTE_AAB="./android/app/build/outputs/bundle/productionRelease/app-production-release.aab"
    PACKAGE_NAME="앱 패키지 이름"
    • .env.FLIos
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    IOS_PROJECT_PATH="./ios/project.xcodeproj"

    SIGNING_IDENTITY_DEBUG="Apple Development: "
    SIGNING_IDENTITY_RELEASE="Apple Distribution: "

    # 개발
    MATCH_ENV_PREFIX_DEVELOPMENT="sigh_io.project.dev_development"
    MATCH_ENV_PREFIX_DEVELOPMENT_EXT="sigh_io.project.dev.OneSignalNotificationServiceExtension-Dev_development"

    MATCH_ENV_PREFIX_ADHOC="sigh_io.project.dev_adhoc"
    MATCH_ENV_PREFIX_ADHOC_EXT="sigh_io.project.dev.OneSignalNotificationServiceExtension-Dev_adhoc"

    APPCENTER_API_TOKEN=앱센터 토큰
    APPCENTER_OWNER_NAME="앱센터 사용자 이름"
    APPCENTER_APP_NAME="앱센터 앱 이름"
    APPCENTER_DISTRIBUTE_IPA="./projectDev.ipa"

    # 상용
    MATCH_ENV_PREFIX_APPSTORE="sigh_io..project.app_appstore"
    MATCH_ENV_PREFIX_APPSTORE_EXT="sigh_io.project.app.OneSignalNotificationServiceExtension-Prod_appstore"

    STORE_DISTRIBUTE_IPA="./project.ipa"

#4. env 로드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
platform :android do
before_all do
Dotenv.overload '../.env.FLAndroid'
...
end
...
en

----------------------------------------------

platform :ios do
before_all do
Dotenv.overload '../.env.FLIos'
...
end
...
en

#5. Appfile 셋팅 (환경변수 파일)

  • 필요에 따라 작성하면 된다.
1
2
3
4
5
# app_identifier('io.project') # The bundle identifier of your app
apple_id('[email protected]') # Your Apple email address

# itc_team_id('####') # App Store Connect Team ID
# team_id("ABCDE") # Developer Portal Team ID

03. How to Run Fastlane

local에 설치 된 ruby 버전이 아닌 프로젝트에서 지정한 ruby버전을 사용하기 위해 bundle exec 명령어를 이용

1
2
bundle update --bunder
bundle exec fastane ....

Install Plugin

1
2
3
4
5
bundle exec fastlane add_plugin appcenter
bundle exec fastlane add_plugin load_json
bundle exec fastlane add_plugin yarn

# ... 등등 필요한 플러그인을 추가한다.
  • add plugin 이후, fastlane 폴더 내 Pluginfile이 생성

    1
    2
    3
    4
    5
    6
    7
    # Autogenerated by fastlane
    #
    # Ensure this file is checked in to source control!

    gem 'fastlane-plugin-appcenter'
    gem 'fastlane-plugin-load_json'
    gem 'fastlane-plugin-yarn'
  • Pluginfile 생성 체크 후, 프로젝트 루트 디렉토리에 Gemfile 내에 생성된 경로와 일치한지 확인하기

    1
    2
    3
    4
    ...

    plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile')
    eval_gemfile(plugins_path) if File.exist?(plugins_path)
  • 마무리

    1
    2
    bundle install
    # 이후, Gemfile.lock에 추가한 플러그인이 생겼는지 확인

[Fastlane] Fastlane을 통해 빌드를 자동화하자 1편

https://devch.co.kr/2022/06/01/Fastlane-1-22-06-01/

Author

Chaehyeon Lee

Posted on

2022-06-01

Updated on

2022-06-26

Licensed under

댓글