限定

Flutter + GitHub Actions + Mac mini セルフホストRunner iOS CIアーキテクチャ

CI Flutter · セルフホストRunner
2026-06-05 約 8 分

Flutter iOS CIは「ubuntu-latestmacos-latestに差し替えるだけ」ではありません。これは三層アーキテクチャの設計判断です:コントロールプレーンはGitHubに残し、実行プレーンはMac mini M4、キャッシュプレーンはローカルSSD。本記事は3つのことを行います:このモデルを確立し、移行判断マトリクスを提供し、痛みのある箇所から深掘り専門記事へ案内します。

この記事が行うこと

  1. Flutter iOS CI = コントロールプレーン + 実行プレーン + キャッシュプレーンという三層メンタルモデルを確立する。
  2. macos-latest vs セルフホストの移行判断マトリクスを提供し、5分で意思決定できるようにする。
  3. 詳細な実装を5つの専門記事に振り分ける——あなたの問題に直接アクセス。
Flutter GitHub ActionsとMac miniセルフホストRunner CIアーキテクチャ図
Flutter クロスプラットフォームCI:コントロールプレーンはGitHub、iOSビルドの実行はMac miniセルフホストRunner。

三層CIモデル

具体的なツールを見る前に、一つの等式を確立しましょう——どの層を修正すべきかを決定します:

Flutter iOS CI =
  コントロールプレーン(GitHub Actions:トリガー・承認・Secrets管理)
+ 実行プレーン      (Mac mini M4  :iOSネイティブビルド・署名・環境確定性)
+ キャッシュプレーン(ローカルSSD  :依存関係とビルド成果物の永続化)

このシリーズ全体の判断を左右する3つの推論:

  1. コントロールプレーンはコードを実行しない。 workflow YAMLを最適化してもビルドは速くなりません。ビルド時間を削減するには実行プレーンを置き換える必要があります。
  2. 実行プレーンが再現性を決定する。 共有プール(macos-latest)のXcodeバージョンはGitHubの更新に追従します。セルフホストマシンのバージョンはあなたが固定できます。
  3. キャッシュプレーンが速度を決定する。 セルフホストの速度優位は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判断ガイド を参照。

このアーキテクチャを動かすMac miniが必要ですか?

kvmbootはテナント専用のMac mini M4(16GB / 24GB)をSSH/VNC経由で提供し、日・週・月単位での課金に対応しています。コントロールプレーンはGitHubのまま、実行プレーンをこのマシンに切り替えるだけです。本記事の三層モデルに従えば、Day 0でセットアップ、Day 1でCIパイプライン接続、Day 2で署名の検証が一般的な流れです。初回ビルドから一貫したXcodeバージョンで構築できます。

スペックとプラン:プランを見る · 構成オプション