이번 포스팅은 “GitLab과 Fastlane으로 iOS 앱 빌드 및 배포 자동화하기” 시리즈의 두 번째 글로, GitLab CI/CD 파이프라인을 구성하기 전에, Fastlane으로 Lint, Test, TestFlight 배포 등 각 단계별로 Lane을 정의하는 방법에 대해 알아보겠습니다.
이번 글에서는 Fastlane을 설치하고 기본 설정을 한 후, 필요한 환경 변수를 추가하고 각 단계별 Lane을 정의하는 내용을 다룹니다. 또한 match
방식으로 코드 사이닝 하는 방법도 설명합니다.
Fastlane 소개
Fastlane은 Android 및 iOS 배포를 단순화하는 것을 목표로 하는 오픈 소스 플랫폼입니다. Fastlane을 사용하면 스크린샷 생성, 코드사이닝, 빌드 번호 올리기, 애플리케이션 릴리스와 같은 개발 및 릴리스 워크플로의 모든 지루한 작업을 자동화할 수 있습니다.
Fastlane 설치
Fastlane은 여러 가지 방법으로 설치할 수 있으나, Bundler와 Gemfile을 사용하여 설치하는 것이 좋습니다.
앱 을 빌드하고 업로드하는 데 문제가 발생하지 않도록, 로케일(Locale) 관련 환경변수를 추가합니다.
Terminal 또는 iTerm을 열고, ~/.bashrc
, ~/.bash_profile
, ~/.profile
또는 ~/.zshrc
에 아래 환경 변수를 추가합니다.
export LC_ALL=ko_KR.UTF-8
export LANG=ko_KR.UTF-8
아래 명령을 실행하여 적용합니다.
source ~/.zshrc
Xcode 프로젝트 디렉토리로 이동하여 Gemfile
파일을 생성하고 아래 내용을 작성합니다.
source "https://rubygems.org"
gem "fastlane"
아래 명령을 실행하면 ./vendor/bundle
경로에 fastlane과 필요한 Ruby gem(라이브러리)이 설치되고, 버전 컨트롤을 위한 ./Gemfile.lock
이 생성됩니다.
bundle install --path vendor/bundle
fastlane 버전을 확인합니다.
$ fastlane --version
fastlane installation at path:
/Library/Ruby/Gems/2.6.0/gems/fastlane-2.206.2/bin/fastlane
-----------------------------
[✔] 🚀
fastlane 2.206.2
Fastlane 기본 설정
Lint, Test, TestFlight 배포 등 각 단계를 Lane으로 정의하기 전에, 구성 정보를 정의하는 Fastfile
파일과 Apple ID 또는 애플리케이션 Bundle Identifier와 같은 앱 관련 정보를 저장하는 Appfile
파일을 생성해야 합니다.
fastlane init
명령을 실행한 후, 빠르게 진행하게 위해 4
를 선택하고 Enter 키를 누릅니다.
$ fastlane init
[✔] 🚀
...
[✔] Looking for iOS and Android projects in current directory...
[14:32:32]: Created new folder './fastlane'.
[14:32:32]: Detected an iOS/macOS project in the current directory: 'MyFirstApp.xcodeproj'
[14:32:32]: -----------------------------
[14:32:32]: --- Welcome to fastlane 🚀 ---
[14:32:32]: -----------------------------
[14:32:32]: fastlane can help you with all kinds of automation for your mobile app
[14:32:32]: We recommend automating one task first, and then gradually automating more over time
[14:32:32]: What would you like to use fastlane for?
1. 📸 Automate screenshots
2. 👩✈️ Automate beta distribution to TestFlight
3. 🚀 Automate App Store distribution
4. 🛠 Manual setup - manually setup your project to automate your tasks
? 4
이후, 프롬프트가 나오면 계속해서 Enter 키를 누릅니다.
fastlane
폴더에 Appfile
및 Fastfile
파일이 생성됩니다.
fastlane/Appfile
파일에서 앱의 Bundle ID와 Apple ID으로 수정합니다. 여러 팀에 속해 있으면 Developer Portal 및 App Store Connect의 Team ID를 추가합니다.
app_identifier("net.infograb.MyFirstApp") # The bundle identifier of your app
apple_id("your_account@company.com") # Your Apple email address
itc_team_id("123456789") # App Store Connect Team ID
team_id("Q2CBPJ58CA") # Developer Portal Team ID
# For more information about the Appfile, see:
# https://docs.fastlane.tools/advanced/#appfile
Pod Install Lane
첫 번째로 구성할 Lane은 프로젝트에서 사용하는 의존성 라이브러리를 설치하기 위한 구성입니다.
Swift 스타일 및 코딩 컨벤션을 적용하는 도구인 SwiftLint를 CocoaPods를 통해 설치합니다.
CocoaPods는 Swift 및 Objective-C Cocoa 프로젝트에 많이 사용되는 의존성 매니저(dependency manager)입니다. 90,000개 이상의 라이브러리가 있으며 300만 개 이상의 앱에서 사용됩니다.
-
pod init
명령을 실행하면, 프로젝트 루트 디렉토리에Podfile
파일이 생성됩니다. -
Podfile
파일에pod 'SwiftLint'
을 추가합니다.# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'
target 'MyFirstApp' do
# Comment the next line if you don't want to use dynamic frameworks
use_frameworks!
# Pods for MyFirstApp
pod 'SwiftLint'
target 'MyFirstAppTests' do
inherit! :search_paths
# Pods for testing
end
target 'MyFirstAppUITests' do
# Pods for testing
end
end -
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 "Runs `pod install`"
puts "Runs `pod install`"
lane :pod_install do
cocoapods(
clean_install: true,
podfile: "./Podfile"
)
end
end -
Gemfile
파일에gem "cocoapods"
을 추가합니다.source "https://rubygems.org"
gem "fastlane"
gem "cocoapods" -
아래 명령을 실행하여
cocoapods
를 설치합니다.bundle install --path vendor/bundle
-
bundle exec fastlane pod_install
명령으로 Lane을 실행합니다.$ bundle exec fastlane pod_install
[✔] 🚀
...
[14:37:18]: ------------------------------
[14:37:18]: --- Step: default_platform ---
[14:37:18]: ------------------------------
[14:37:18]: Runs `pod install`
[14:37:18]: Driving the lane 'ios pod_install' 🚀
[14:37:18]: -----------------------
[14:37:18]: --- Step: cocoapods ---
[14:37:18]: -----------------------
[14:37:19]: $ cd '.' && bundle exec pod install --clean-install
[14:37:19]: ▸ Analyzing dependencies
[14:37:19]: ▸ Downloading dependencies
[14:37:19]: ▸ Installing SwiftLint (0.47.1)
[14:37:19]: ▸ Generating Pods project
[14:37:19]: ▸ Integrating client project
[14:37:19]: ▸ Pod installation complete! There is 1 dependency from the Podfile and 1 total pod installed.
[14:37:19]: ▸ [!] Automatically assigning platform `iOS` with version `15.4` on target `HelloWorld` because no platform was specified. Please specify a platform for this target in your Podfile. See `https://guides.cocoapods.org/syntax/podfile.html#platform`.
+------+------------------+-------------+
| fastlane summary |
+------+------------------+-------------+
| Step | Action | Time (in s) |
+------+------------------+-------------+
| 1 | default_platform | 0 |
| 2 | cocoapods | 1 |
+------+------------------+-------------+
[14:37:19]: fastlane.tools finished successfully 🎉