アプリ配布作業にまつわる問題
テスターへの配布やApp Storeリリース版アップロードなどのアプリ配布作業は煩雑で、地味に工数がかかったり、ビルドのミス(証明書の間違い等)の原因となったりします。
現在関わっているプロジェクトではまだCIツールを導入していないのですが、配布作業の一部を自動化できないかということで、今回fastlaneの利用を検討しました。
※以下、本記事ではCircleCIのようなツールとの連携については触れません
fastlane
fastlane (Github)はiOSアプリのリリースプロセスを自動化できるツールです。
以下のように、fastlaneを使うと様々な工程を自動化することができます。
###fastlane Toolchain
※メモのため日本語に訳しました
- deliver : スクリーンショット、メタデータ、アプリをApp Storeにアップロード
- snapshot : アプリのスクリーンショット撮影を自動化
- frameit : スクリーンショットを各デバイス画像にはめる
- pem : プッシュ通知プロファイルの生成と更新
- sigh : プロビジョニングプロファイルのダウンロード、更新、生成等
- produce : iTunes Connectで新しいiOSアプリを作成
- cert : code signing certificates の作成と管理
- codes : プロモコードの作成 *deprecated
- spaceship : iTunes ConnectやApple Dev Centerにアクセス
- pilot : TestFlightテスターの管理
- boarding : TestFlightテスターの招待
- gym : アプリのビルド
- match : Gitで証明書とプロファイルをチーム管理
今回は、deliver, sigh, gymを利用してみることにします。
セットアップ方法
公式のガイド の手順通りに進めると、すんなりインストールすることができました。
以下のコマンド以降は対話形式となっており、最低限の設定は迷わずに終わります。
$ fastlane init
サンプル
以下を行うためのFastfileのサンプルです。
- Crashlyticsでステージング版を配布
$ fastlane crashlytics
- iTunes Connectへリリース版をアップロード
$ fastlane appstore
※今回は配布先に応じて、Info.plistの内容を書き換えてみます
fastlane_version "1.57.0"
default_platform :ios
platform :ios do
PLIST_PATH = "./YourApp/Info.plist"
before_all do
# Crashlyticsの設定
ENV['CRASHLYTICS_API_TOKEN'] = "YOUR_API_TOKEN"
ENV['CRASHLYTICS_BUILD_SECRET'] = "YOUR_BUILD_SECRET"
# git statusのチェック
ensure_git_status_clean
# pod install
cocoapods
end
desc "Crashlyticsでグループに配布"
lane :crashlytics do
sigh(
skip_install: true,
app_identifier: "com.example.YourApp",
development: true
)
# Bundle ID, Bundle display nameを変更してみる
# ビルド後、Info.plistは変更前の状態に戻す
backup_file(path: PLIST_PATH)
update_info_plist(
plist_path: PLIST_PATH,
app_identifier: "com.example.YourApp.staging",
display_name: "YourApp-STG"
)
gym(
clean: true,
scheme: "Staging of YourApp"
)
restore_file(path: PLIST_PATH)
crashlytics(
crashlytics_path: "./Crashlytics.framework", # CocoaPodsでCrashlyticsをインストールした場合は"./Pods/Crashlytics/iOS/Crashlytics.framework"
notes: "fastlaneによる配布", # リリースノート
groups: ['your-group-alias'] # group名ではなくエイリアス
)
end
desc "iTunes Connectにリリースビルドをアップロード"
lane :appstore do
sigh(
skip_install: true,
app_identifier: "com.example.YourApp",
development: false
)
gym(
clean: true,
scheme: "Release of YourApp"
)
deliver(
force: true,
skip_screenshots: true,
skip_metadata: true
)
end
end
アプリのビルド時やCrashlytics側でエラーとなった場合はコマンドラインにエラー内容が出力されるので、適宜対処します。
※実行完了時やエラー時にSlackに通知するといったことも可能です
今回はInfo.plistの書き換えのために、update_info_plist, backup_file, restore_file のアクションを使ってみました。アクションのリストは以下のコマンドで確認することができます(沢山のアクションがあります)。
$ fastlane actions
実用例(概要、Fastfileのサンプル)
-
fastlane Example Setups
実際のサービスで使われている例。Fastfileの書き方が参考になります。 -
Fitbay Fastfile
上記のサンプルのうち、Fabric (Crashlytics) が使われているもの。
所感
これで、コマンド一発でアプリを配布できるようになりました。OrganizerやFabricの操作を減らせて良さそうな感じがします(これまで手動だったので)。
fastlane toolsの組み合わせ次第で、細かな部分も自動化できそうです。