短周期のiOSチームは日単位でクラウドMac Runnerを借り、TestFlight向けにバーストします。署名はここで現実と衝突します。短命ディスク、並列Job、アプリコードから隔離したシークレット保管。Fastlane Matchは依然として実用的な既定で、証明書とプロビジョニングプロファイルをGit上の暗号化Blobに載せ、各Runnerのキーチェーンへ展開します。失敗は想定どおり(古いProfile、パスフレーズのずれ、同一ブランチを二つのJobが書き換える)ですが、読み取りと書き込みを分離し並行性を固定すれば、退屈な工学でほとんど解けます。Runner登録と最小権限トークンの観点は2026年・短周期突発ビルドの本番接続:クラウドMac開通後のRunner登録、ネットワーク自己確認、最小権限トークンの30〜60分チェックリストとFAQと併せて読むと安全に繋がります。
Match+暗号化Git:Runnerに実際に載るもの
Matchは専用リポジトリ(多くは非公開)に暗号化された.p12とmobileprovision、メタデータを置きます。パスフレーズはGitに入れず、CIのシークレット管理から環境変数で注入します。日単位のクラウドMacではチェックアウト先を捨て可能とみなし、毎回クリーンにcloneしてアーカイブ系レーンはmatchを読み取り専用で実行し、更新が必要な管理用Jobだけreadonly: falseを許可するのが安全です。この一行方針で「CIが署名用ブランチを壊した」大半を防げます。
ブランチと権限
環境ごとに既定ブランチ(例:mainで本番署名材)を分け、マージ権を絞ります。CI用トークンはリポジトリ単位・contents読み取りのみ。人間の管理者は再発行用に別経路を持ちます。Ad HocとApp StoreのProfileを同一Repoに混在させる場合はディレクトリ名を明確にし、並列実行でMatchのtypeが互いを上書きしないようにします。
クラウドMac Runnerでの読み取り専用HTTPS clone
細かくスコープしたPATやHTTPS向けdeploy keyは、借りたマシンに長寿命SSH鍵を置くより監査しやすいです。GIT_TERMINAL_PROMPT=0で認証待ちを即失敗させ、Match Repoは浅いcloneにして短時間セッションの課金を抑えます。プロバイダがIPを再利用する場合はGitホストのレート制限に注意し、バックオフはMatch本体ではなくパイプライン側のラッパに置きます。
export GIT_TERMINAL_PROMPT=0 export MATCH_READONLY=true # archive / test レーン # 任意:大きいLFS Blob向けに低速タイムアウトを延ばす export GIT_HTTP_LOW_SPEED_LIMIT=1000 export GIT_HTTP_LOW_SPEED_TIME=120
複数Jobの証明書衝突:意思決定マトリクス
同時に二つのJobが書き込み付きでMatchを叩く、または同一app_identifierでtype設定が食い違うと、Gitのpush競合やキーチェーンインストールの競合が起きます。並列を広げる前に下表で整理してください。マネージドmacOSと日単位セルフホストRunnerの比較は2026年・短周期iOSビルドの代替案:CircleCIのクラウドmacOSと日単位クラウドMacのセルフホストRunner——プライベート依存、並行上限、キューSLOの意思決定マトリクスFAQが近い文脈です。
| 並列状況 | リスク | 判断 |
|---|---|---|
全JobがMATCH_READONLY=true、同一ブランチ |
低:読み取り競合のみ | Runner間で並列可 |
| 読み取り+再発行Jobが1本 | 中:push競合・部分clone | 書き込みはmutexラベルで直列化、読み取りは他Runner |
| 再発行Jobが二つ、同一識別子 | 高:二重発行・Git衝突 | 単一フライトにハードゲート、ブランチ自動更新を無効化 |
| 別アプリ・共有Repo・共有パスフレーズ | 中:app_identifierの人的ミス |
Repo分割かレーン単位でgit_branchを製品別に固定 |
実装チェックリストFAQ
本番署名を有効にする前に、新しいクラウドMacイメージまたはRunnerラベルで毎回確認します。
- 事前確認 — Xcodeのメジャーが
DEVELOPMENT_TEAM設定と整合し、Apple中間証明書が揃っている。 - シークレット —
MATCH_PASSWORD、App Store Connect APIキー、Match Repo専用のGit HTTPSトークン。 - ネットワーク — AppleとGitホストへの443、非対話(
CI=1でFastlaneのプロンプト抑制が効く箇所)。 - 並行性 — 既定パイプラインは
MATCH_READONLY、更新ワークフローだけ解除。 - ジョブ後 — 共有プールではキーチェーンリセットやログアウトスクリプト、成果物アップロード後に一時ディレクトリ削除。
FAQ断片
「codesignがキーチェーンへのアクセスを求めている」 — CIでは$TMPDIRの使い捨てキーチェーンファイルでロック解除し、ログインキーチェーンは使わない。スプリント中にProfile期限切れ — 更新レーンを一本だけ走らせ、Profileを上げてMatch Repoへコミットしてから読み取り専用Jobを再展開。二アプリでBundle IDのタイポ — コンパイルではなくアップロードで落ちるので、アーカイブ前にgymのメタデータ検査を足す。
クラウドMac miniなら署名レーンが読みやすい
FastlaneとXcodeは本物のmacOSキーチェーンとAppleのコード署名ツールチェーンを前提にします。Linuxエージェントだけでは扱いづらい領域です。専用のクラウドMac miniなら、SonomaやSequoiaなどピン留めしたベースライン、スクリプト向けのネイティブUnix、そしてアーカイブとSwiftコンパイルのピークがRAMを奪い合いにくい統合メモリ余白を一度に確保できます。
Apple SiliconノードはApple API待ちの間も待機電力が非常に低く、macOSの署名スタックはレビュアーのローカルと同じ系譜なので「CIだけで起きる署名の驚き」を減らせます。GatekeeperとSIPは配布要件とも整合し、エミュレーションやリモート専用ツールチェーンのサポート負荷も避けられます。
ハードを買わず日単位Runnerで回したいなら、VPSSparkのクラウドMac mini M4は読み取り専用Matchとアーカイブパイプラインを載せる現実的な拠点です——プランを今すぐ確認し、短周期リリースをレールに乗せましょう。