この記事が行うこと
- Flutter iOS CI = コントロールプレーン + 実行プレーン + キャッシュプレーンという三層メンタルモデルを確立する。
- macos-latest vs セルフホストの移行判断マトリクスを提供し、5分で意思決定できるようにする。
- 詳細な実装を5つの専門記事に振り分ける——あなたの問題に直接アクセス。
三層CIモデル
具体的なツールを見る前に、一つの等式を確立しましょう——どの層を修正すべきかを決定します:
Flutter iOS CI =
コントロールプレーン(GitHub Actions:トリガー・承認・Secrets管理)
+ 実行プレーン (Mac mini M4 :iOSネイティブビルド・署名・環境確定性)
+ キャッシュプレーン(ローカルSSD :依存関係とビルド成果物の永続化)
このシリーズ全体の判断を左右する3つの推論:
- コントロールプレーンはコードを実行しない。 workflow YAMLを最適化してもビルドは速くなりません。ビルド時間を削減するには実行プレーンを置き換える必要があります。
- 実行プレーンが再現性を決定する。 共有プール(
macos-latest)のXcodeバージョンはGitHubの更新に追従します。セルフホストマシンのバージョンはあなたが固定できます。 - キャッシュプレーンが速度を決定する。 セルフホストの速度優位はCPUではなく、ローカルSSDがジョブごとのリモートキャッシュアップロード/ダウンロードを不要にすることから生まれます。
なぜFlutter iOS CIに専用macOS実行プレーンが必要か
FlutterはLinuxでAndroidビルドと単体テストを処理できますが、iOSビルドとApp Store公開はmacOSでのみ実行できます——これはAppleツールチェーンの制約であり、Flutter自体の問題ではありません。
そのため、すべてのFlutterチームはアーキテクチャの選択に直面します:iOSの実行はどこで行うか?macos-latestから離れる動機となる3つの摩擦:
- コスト:GitHubホストのmacOS Runnerは、Linuxと比べて分単価が大幅に高くなります。iOSのコールドビルドは20〜30分かかることもあり、ビルド頻度が上がると請求額が急増します。
- 環境の確定性:ホストイメージのXcodeバージョンはGitHubの更新に追従し、固定できません。「ローカルは通る、CIは失敗する」という調査コストが繰り返し発生します。
- ビルド速度:iOS依存関係のサイズは大きく、ホストRunnerはジョブごとにキャッシュを再アップロード・再ダウンロードします。ローカルSSDを持つセルフホストマシンはこのボトルネックを根本から解消します。
「macOS実行プレーンを制御された境界内に戻す」——これがこのアーキテクチャの中心的な設計判断です。コントロールプレーンはGitHubに残し(PRトリガー、レビューゲート、Secrets管理)、実行層だけをテナント専用のMac mini M4に切り替えます。
公式ドキュメント:GitHubセルフホストRunner · Flutter CD ガイド
アーキテクチャ全体像
パイプライン全体を三層モデルにマッピングします——障害発生時はまずどの層かを特定し、対応する専門記事へ:
| プレーン | 担当すること | 担当しないこと | 障害のサイン |
|---|---|---|---|
| コントロールプレーン | トリガールール、権限境界、Secrets注入、成果物アップロード | ビルドコードを一切実行しない | Jobが起動しない / 権限エラー / PRゲート不具合 |
| 実行プレーン | iOSネイティブビルド、Xcodeバージョン固定、署名チェーン | トリガーロジックとSecretsのソースは管理しない | ビルド環境ドリフト / 署名失敗 / Runner オフライン |
| キャッシュプレーン | 依存関係とビルド成果物のジョブ間永続化 | ビルドトリガーと実行環境は決定しない | ホットビルド≈コールドビルド / ディスク警告 / ランダム失敗 |
Flutter iOS CIの障害はすべてこの3行のいずれかに分類できます。プレーンを正しく特定すれば、修正の道筋が明確になります。
移行判断マトリクス:いつ移行すべきか
セルフホストがデフォルトの答えではありません。5分間のチームレビューで判断するためのマトリクス:
| シグナル | macos-latestを維持 | セルフホストへ移行 |
|---|---|---|
| ビルド頻度 | 月40回未満のiOSビルド | 月40回超、または毎日複数回 |
| 環境安定性 | Xcodeマイナーバージョンに非依存 | Xcode/SDKバージョンの固定が必要 |
| ビルド速度 | ホットビルド8分未満で許容範囲 | ホットビルドが継続して8分超でイテレーションに影響 |
| リリースパイプライン | App Store署名不要 | App Store/TestFlightリリースパイプラインあり |
| 運用意欲 | ゼロ運用優先 | 月1回のメンテナンスウィンドウと引き換えに制御性を確保 |
経験則:「移行」シグナルに3つ以上該当する場合——セルフホストは通常2〜4週間でコストを回収できます(マシンレンタル費 vs 節約できるホストmacOS分単価)。
専門記事シリーズ:問題箇所から直入り
本記事はアーキテクチャの理解と移行判断のみを扱います。各実行層の詳細は専門記事でカバーしています:
| 専門記事 | 答える核心的な問い | プレーン | リンク |
|---|---|---|---|
| ① Runner構築 | Mac miniを安定稼働・スケジュール可能・セキュアに保つ方法 | 実行 | 近日公開 |
| ② 三層キャッシュモデル | なぜiOSビルドが速くならないのか、ローカルSSDで解決する方法 | キャッシュ | 近日公開 |
| ③ 署名とリリース | 無人CIでiOS署名とApp Storeアップロードを完結させる方法 | 実行 | 近日公開 |
| ④ Workflow設計 | Android/iOS分離、パスフィルタリング、並行制御の設計方法 | コントロール | 近日公開 |
| ⑤ 運用と安定性 | なぜCIが壊れるのか、Runnerオフラインからの回復、ディスク管理 | 実行 + キャッシュ | 近日公開 |
シナリオ別の入口選択
- ゼロから構築:本記事でアーキテクチャ方向を確認 → ①「Runner構築」でマシンをセットアップ → ②「キャッシュモデル」で速度を最適化 → ③「署名」でリリースパイプラインを接続。
- Runnerはあるが、iOSビルドが遅い:②「三層キャッシュモデル」に直行。
- 署名またはTestFlightがスタック:③「署名とリリース」へ。
- Runnerがオフライン / ビルドがランダムに失敗:⑤「運用と安定性」へ。
- BitriseなどのクラウドCIから移行:移行コスト比較表は Bitrise vs セルフホストクラウドMac判断ガイド を参照。