専用のMacビルドサーバーにfastlaneをセットアップする
Macのビルドサーバーでは、fastlaneが推奨するBundlerか、Homebrewでfastlaneをインストールします。署名はmatchで管理し、CIではreadonlyで実行し、AppleへのログインにはApp Store Connect APIキーを使います。CIのレーンはsetup_ciで始め、fastlaneに一時的なキーチェーンを使わせます。あとはCIのジョブでbundle exec fastlane betaというコマンドを1つ実行するだけです。
最初に必要なもの
- Xcode、管理者権限、HomebrewのあるMac。
- そのMac上のCIエージェント:GitHub Actions、GitLab、Buildkite、Jenkins、CircleCIのいずれか。
- APIキーを作成する権限のあるApp Store Connectアカウント。
- match用のプライベートなGitリポジトリ、またはGoogle CloudかS3のバケット。
1. fastlaneをインストールする
2026年10月に読んだfastlaneのドキュメントは、Bundlerを推奨しています。Ruby 3.2以降をサポートし、3.3以降を推奨しています。macOSのシステムRubyは使わないよう勧めています。rbenvなどのバージョンマネージャーで最新のRubyをインストールし、プロジェクトにGemfileを追加します。
source "https://rubygems.org" gem "fastlane"
gem install bundler bundle update git add Gemfile Gemfile.lock
BundlerはGemfile.lockでfastlaneのバージョンを固定します。どのマシンでも、どのCIの実行でも同じバージョンが使われます。bundle exec fastlaneとして実行します。
ビルドサーバーが1台だけなら、Homebrewのほうが簡単です。Ruby込みで入ります。
brew install fastlane
プロジェクトごとにどちらか1つを選んでください。両方を混ぜると、1台のマシンにfastlaneが2つのバージョンで入ってしまいます。
2. App Store Connect APIキーを作成する
fastlaneは、Apple IDでのログインよりAPIキーを推奨しています。2段階認証のプロンプトがなく、速く、より確実だからです。App Store Connectで「ユーザとアクセス」、「統合」、「App Store Connect API」の順に開きます。チームキーを作成します。fastlaneによると、プロビジョニングの呼び出しにはチームキーが必要です。動作する範囲で最小の役割を与えてください。発行者IDとキーIDを控えます。.p8ファイルはすぐにダウンロードしてください。Appleがダウンロードを許すのは一度だけです。
mkdir -p ~/.appstoreconnect mv ~/Downloads/AuthKey_ABC123XYZ.p8 ~/.appstoreconnect/ chmod 600 ~/.appstoreconnect/AuthKey_ABC123XYZ.p8
キーはビルド用のMacか、CIのシークレットストアに保管してください。決してコミットしないでください。
3. matchを開発マシンから一度だけセットアップする
bundle exec fastlane match init bundle exec fastlane match development bundle exec fastlane match appstore
match initは証明書の保存先を尋ね、Matchfileを書き出します。続く2つのコマンドで証明書とプロファイルを作成し、暗号化してその保存先に保存します。強力なパスフレーズを選んでください。CIはそれをMATCH_PASSWORD変数から読み取ります。
fastlaneは、どのCIシステムでもreadonlyモードを推奨しています。そうすればCIは既存のものをダウンロードするだけで、何かを作成したり失効させたりすることはありません。
4. レーンを書く
default_platform(:ios)
platform :ios do
lane :test do
run_tests(
scheme: "MyApp",
devices: ["iPhone 17"],
result_bundle: true
)
end
lane :beta do
setup_ci
api_key = app_store_connect_api_key(
key_id: ENV["ASC_KEY_ID"],
issuer_id: ENV["ASC_ISSUER_ID"],
key_filepath: ENV["ASC_KEY_PATH"]
)
match(type: "appstore", readonly: is_ci, api_key: api_key)
increment_build_number(
build_number: latest_testflight_build_number(api_key: api_key) + 1
)
build_app(scheme: "MyApp")
upload_to_testflight(api_key: api_key, skip_waiting_for_build_processing: true)
end
endsetup_ciは一時的なキーチェーンを作成し、matchをreadonlyに切り替え、ログとテスト結果のパスを設定します。動作するのは、fastlaneがCIでの実行を検出したときだけです。検出されない場合はforce: trueを渡します。ビルド処理の待機を省くとジョブは早く終わりますが、fastlaneによると外部テスターへの配布も省かれます。
5. CIから呼び出す
どのCIシステムでも、実行するシェルの行は同じです。シークレットはリポジトリではなく、CIに保存してください。
export LANG=en_US.UTF-8 export LC_ALL=en_US.UTF-8 bundle install bundle exec fastlane beta # needs MATCH_PASSWORD, ASC_KEY_ID, ASC_ISSUER_ID and ASC_KEY_PATH set as CI secrets
GitHub Actionsでは、これらの行をrunステップに書き、シークレットはenvとして渡します。MacRunのMacには、GitHub Actionsのrunnerソフトウェアがインストール済みです。ワークフロー全体はGitHub ActionsでのiOSセットアップガイドにあります。GitLab、Buildkite、CircleCIでは、同じ行をジョブのスクリプトに書きます。Jenkinsではshステップを使います。
再起動しても動き続ける仕組み
fastlaneはサービスではありません。CIエージェントのジョブの中で動きます。再起動後に戻る必要があるのは、エージェントとそのログインセッションです。GitLab RunnerとBuildkiteのガイドのように、エージェントをLaunchAgentとして設定し、自動ログインと組み合わせます。setup_ciの一時的なキーチェーンは毎回作り直されます。再起動後にログインキーチェーンがロックされていても、止まることはありません。
よくあるエラーと対処法
以下はfastlaneが記載しているものです。
- CIで奇妙なエンコーディングのエラーやクラッシュが起きる。fastlaneにはUTF-8のロケールが必要です。
LANGとLC_ALLをen_US.UTF-8に設定してください。 - ジョブが2段階認証のプロンプトで止まる。APIキーを使ってください。Apple IDを使う場合は、
SPACESHIP_ONLY_ALLOW_INTERACTIVE_2FAを設定すれば、止まらずにすぐ失敗します。 - matchがCIで新しい証明書を作ろうとする。
readonlyを使うか、先にsetup_ciを呼び出してください。 - matchがリポジトリをcloneできない。GitHubは1つのデプロイキーを2つのリポジトリで使うことを認めていません。読み取り専用のマシンアカウント、
git_private_key、MATCH_GIT_BASIC_AUTHORIZATIONのいずれかを使ってください。 - プロファイルはインストールされているのに、Xcodeから見えない。Xcode 16でプロファイルのフォルダが移動しました。fastlaneは選択されているXcodeに従うので、Xcodeが2つあるマシンではmatchの前に
xcode_selectを実行してください。
専用Macが役立つ理由
build_appとrun_testsはXcodeのビルドです。DerivedDataとインストール済みのgemを保持するマシンなら、ずっと速くなります。Xcode 26.6でWikipediaのiOSアプリを使った当社のベンチマークでは、クリーンビルドがM6で86秒でした。GitHubホスト型のmacos-26 runnerでは183秒でした。小さな変更後のジョブは、ウォームで27秒、新規で269秒でした。
ビルドサーバーが不要な場合
TestFlightへの配信が週1回なら、ホスト型runnerかXcode Cloudのほうが手間は少なく済みます。その比較はXcode Cloudの代替ガイドをご覧ください。MacRunがしないことにも注意してください。当社はコード署名を管理しません。このページのように、matchはお客様自身で実行します。SLAも提供していません。
ビルドサーバーを用意しますか。すべてのティアは料金ページに、接続方法はセットアップドキュメントにあります。
よくある質問
ビルドサーバーにはHomebrewとBundlerのどちらでfastlaneをインストールすべきですか?
+
fastlaneはBundlerを推奨しています。Gemfile.lockでバージョンを固定できるからです。マシンが1台ならHomebrewのほうが簡単で、Ruby込みで入ります。
fastlaneのsetup_ciは何をしますか?
+
一時的なキーチェーンを作成し、matchをreadonlyに切り替え、ログとテスト結果のパスを設定します。force: trueを渡さない限り、CI上でだけ動作します。
fastlaneでApp Store Connect APIキーを使うのはなぜですか?
+
2段階認証のプロンプトが不要だからです。fastlaneも、Apple IDのセッションより速く確実だとしています。プロビジョニングにアクセスするには、チームキーを作成してください。
CIではmatchをreadonlyモードで実行すべきですか?
+
はい。fastlaneが推奨しています。こうすればCIは既存の証明書とプロファイルをダウンロードするだけで、作成も失効もしません。