[번역] Fastlane으로 리액트 네이티브 앱 배포하기

January 11, 2019

원문: Shipping React Native apps with Fastlane

React 로 네이티브 앱을 만들 수 있다는 것은 굉장한 일입니다. 특히 당신이 네이티브 iOS나 안드로이드 개발자가 아니고 새로운 빌드를 릴리즈 하기 전까지만 해당합니다. 앱스토어에 앱을 수동으로 등록하다 보면 시간을 허비한다는 생각이 들거에요.

Fastlane 은 앱스토어 등록을 좀 더 수월하게 할 수 있도록 도와줍니다. 이 포스트에서 저는 iOS와 안드로이드 앱의 배포를 어떻게 하면 자동화 할 수 있는지 설명하려고 해요. 여기서 주로 다루게 될 주제는 코드 사이닝, 앱 빌드, 베타 배포 등 입니다. 제가 일하는 Ulabox 에서도 리액트 네이티브 앱을 빌드할 때 Fastlane 을 사용합니다.

Fastlane 은 iOS와 안드로이드 앱을 릴리즈 할 수 있도록 도와주는 도구입니다. Fastlane 은 번거로운 태스크들을 다룹니다. 예를들면 앱스토어 등록에 필요한 스크린 샷을 만들거나, 개발과 배포에 필요한 코드 사이닝 문제도 다루며 앱을 릴리즈 하는 일도 합니다.

시작하기

Fastlane 을 설치하기 전에 Xcode command line tools 가 먼저 설치되어 있어야 합니다.

$ xcode-select --install

FastlaneRubyGems 을 이용하거나 homebrew 를 이용하여 설치할 수 있습니다.

# Using RubyGems
$ sudo gem install fastlane -NV

# Alternatively using Homebrew
$ brew cask install fastlane

설치한 후에는 fastlane 폴더를 여러분의 리액트 네이이티브 프로젝트 루트에 생성하세요. 그리고 그 폴더 안에 Fastfile 을 만드세요.

Fastfilelane 이라고 하는 일종의 태스크를 정의하는 파일입니다. lane 은 자동화 프로세스에서 요구하는 태스크들을 순차적으로 실행할 Action 의 모음이라고 생각할 수 있습니다. Action 은 태스크를 정의한 함수를 말합니다.

기본적인 템플릿을 가지고 시작해봅시다. before_all 훅은 세가지 action 으로 구성되어 있습니다. 이것은 master 브랜치가 아무런 변경이 없는 지 확실히 하기 위해서 각각의 lane 이 실행할 때 검사합니다.

fastlane_version '2.53.1'

before_all do
  ensure_git_branch
  ensure_git_status_clean
  git_pull
end

platform :ios do
   # iOS Lanes
end

platform :android do
  # Android Lanes
end

그리고 우리는 두개의 플랫폼, ios와 android lane을 정의해두었습니다. 이 lane 은 다음과 같은 명령어를 통해 실행할 수 있습니다.

$ fastlane ios lane
# or
$ fastlane android lane

Code sign

iOS

코드 사인 문제를 해결하는 좋은 방법은 match 를 이용하는 것입니다. match 를 만들기 전에 다음의 작업을 먼저 수행하세요.

  • Nuke를 이용하여 기존의 profilescertificates 를 제거할 수 있습니다.
  • init 옵션을 통해 match 를 설정하세요.
  • match 를 이용하도록 ios 플랫폼의 lane 을 생성하세요.
desc 'Fetch certificates and provisioning profiles'
lane :certificates do
  match(app_identifier: 'com.app.bundle', type: 'development', readonly: true)
  match(app_identifier: 'com.app.bundle', type: 'appstore', readonly: true)
end

위와 같이 하면 ios lane 이나 다른 lane 에서 certificate를 함수처럼 사용할 수 있습니다. match 는 자동으로 profilescertificate 를 로컬 OS X 키체인에 저장하여 로컬 머신에서 빌드나 배포가 가능하게 만들어 줍니다.

Android

안드로이드의 경우에는 릴리즈 모드로 애플리케이션을 빌드하면 자동으로 앱이 인증됩니다. 하지만 처음에는 signing key 를 생성하거나 fetch 받아서 프로젝트에 추가하는 작업이 필요합니다. 이것과 관련해서는 페이스북의 가이드 문서를 참고하세요.

Build

iOS

인증된 iOS 빌드를 만들기 위해서 우리는 위에서 작업한 certificates를 이용하는 lane 을 만들어야 합니다. 이 lane 에는 베타 테스트를 위한 애플리케이션 배포를 위해 빌드 넘버를 증가시키는 actiongym 을 통해 앱플리케이션을 빌드하는 action 이 필요합니다.

desc 'Build the iOS application.'
private_lane :build do
  certificates
  increment_build_number(xcodeproj: './ios/name.xcodeproj')
  gym(scheme: 'name', project: './ios/name.xcodeproj')
end

Android

인증된 안드로이드의 .apk를 만들기 위해서 우리는 gradle action 을 사용합니다. gradleclean 태스크와 assemble 태스크를 수행하도록 lane 을 만들었습니다.

desc 'Build the Android application.'
private_lane :build do
  gradle(task: 'clean', project_dir: 'android/')
  gradle(task: 'assemble', build_type: 'Release', project_dir: 'android/')
end

그 다음 assembleRelease를 가로채는 이 태스크를 통해 버전코드 충돌을 피할 수 있습니다.

Beta distribution

iOS

테스트 플라이트는 iOS 베타 테스팅 도구입니다. beta lane 에서는 build lane 을 통해 나온 .ipa 파일을 테스트 플라이트로 전송하도록 정의했습니다. 여기에 사용된 pilot은 테스트 플라이트에 배포하도록 도와주는 함수입니다. 다음은 변경된 빌드 넘버를 git 리파지터리에 저장해야 하기 때문에 commit_version_bump, push_to_git_remote 를 사용했습니다.

desc 'Ship to Testflight.'
  lane :beta do
    build
    pilot
    commit_version_bump(message: 'Bump build', xcodeproj: './ios/name.xcodeproj')
    push_to_git_remote
  end

Android

안드로이드는 베타 빌드를 공유하기 위해 Playstore 를 사용합니다. 우리는 이것도 역시 자동화 할 수 있습니다.

안드로이드의 beta lane 은 iOS와 정말 비슷합니다. build lane 을 사용하여 인증된 .apk 를 만들고 변경된 버전 코드를 커밋하고, supply 를 통해 로컬 빌드를 플레이스토어의 베타 릴리즈로 승격합니다.

desc 'Ship to Playstore Beta.'
  lane :beta do
    build
    supply(track: 'beta', track_promote_to: 'beta')
    git_commit(path: ['./android/gradle.properties'], message: 'Bump versionCode')
    push_to_git_remote
  end

Integration as scripts

저는 fastlane 명령어를 현재 빌드 시스템의 일부로 사용할 수 있도록 npm scripts 에 등록해두는 것을 추천합니다.

"scripts": {
  "ios:beta": "fastlane ios beta",
  "android:beta": "fastlane android beta"
}

이제 끝났습니다.

Comments

comments powered by Disqus