2026 iOS CI:GitHub ホスト macOS Runner・Xcode Cloud・専用 Mac クラウドの分課金・キュー・カスタマイズ比較表

財務とプラットフォーム責任者が「GitHub の分だけで足りるのでは?」と詰めてくる場面で、Xcode Cloud と専用 Mac クラウドを同じ土俵で並べる必要がある。本稿は VPS 感覚の Actions 運用に慣れたチーム向けに、分課金・キュー・カスタマイズ境界を三列表で整理し、三つの構成パターンと五手順のルーティング、レビューで引用できる数値目安と FAQ をまとめる。

Diagram comparing GitHub-hosted runners, Xcode Cloud, and dedicated Mac cloud for iOS CI in 2026

TOC

1. 導入概要: 3 種類のコンピューティング能力によって最適化される KPI は何ですか?

まずオブジェクトを明確にしましょう。
GitHub ホスティング macOS ランナー
「Git がトリガーされた後、できるだけ早く YAML を実行する標準化された macOS を取得する」を最適化します。分単位の請求額は組織の割り当てに大きく関係します。
Xcodeクラウド
「Xcode + App Store Connect の提出、テスト、配布のクローズド ループ」を最適化し、分単位の請求は Apple のパッケージに従い、カスタマイズはプラットフォームの境界に従う。
プライベート Mac クラウド
macOS を SSH、タグ付け、固定ディスク、エクスポートが可能な専用のコンピューティング能力として扱うと、同時実行性、DerivedData、キーチェーン、エンタープライズ エクスポートの自動制御と引き換えに、ホストのリース期間が近づくとトラフィックによって請求額が増加します。誤解は、これら 3 つを代替品とみなすことです。ランナーは TestFlight の緊密な統合を気にしません。以下では、まず問題点を分析し、次に 3 つのリストと組み合わせスクリプトを示します。

2. 問題点の解消: 分単位の料金、キュー、Apple の環境境界、ディスク競合

レビュー資料における最も一般的な 4 つのタイプの矛盾は次のとおりです。

分単位の料金と待ち行列
: ホスティングの時間が「キューイングとコンパイル」に分割されていない場合、同時実行を追加すると費用が節約できると誤って判断しやすくなります。

生態学的統合 vs. 自由
: Xcode Cloud 証明書と ASC 間の接続には問題はありませんが、スクリプト マトリックスには境界があります。マネージド Runner シェルはより自由ですが、依然としてミラーとネットワークの制約を受けます。専用プールは複数の Xcode およびプライベート レジストリと共存でき、運用とメンテナンスはチームに返されます。

ディスクとキャッシュ
: ホスティングはアクション キャッシュ セマンティクスに依存します。クラウドはプラットフォームによってホストされます。専用プールでは DerivedData を修正できますが、ディスク水位アラームを装備する必要があります。 1 桁の GB が使用可能な場合、リンクはランダムな障害を起こしやすくなります。

コンプライアンス輸出
: 固定ソース IP、プロキシ チェーン、PKCS アライメント優先順位の専用プール。純粋なホスティングでは、監査期間中に製品のアウトバウンドの不整合が明らかになることがよくあります。

3. 3 列の意思決定マトリックス: ホスト型ランナー / Xcode クラウド / 専用 Mac クラウド

次の表は、請求、キュー、カスタマイズ性、運用と保守の負担を比較したもので、アーキテクチャで直接説明できます。ハイブリッドは、4 番目のタイプのコンピューティング能力ではなく、3 つの列を組み合わせたものです。

4. 導入ステップ:測定から配合発売までの5つのステップ

以下の順序で進めることをお勧めします。

細分化されたメジャー
: キューの待機時間、コンパイル時間、および再試行時間は個別に管理されます。クラウドはワークフローキューを記録します。専用プールはディスクとメモリのピークを記録します。

カスタム組み合わせスクリプト
:小規模チームクラウド + 少量のホスティング。ピークホスティング PR + 専用アーカイブ。専用のエンタープライズ ネットワークをプライマリ ホスティングおよび補助として使用します。

ベースラインとラベル
:SSHチェック
xcodebuild -バージョン
、ディスクは 40GB 以上であることをお勧めします。ラベルにはリージョンと Xcode のマイナー バージョンが含まれます。

並行性とクリーンアップ
: メモリのピーク値に応じて並列度を決定します。 DerivedData はパスを分割します。クリーンアップ フックは Runbook に書き込まれます。

拡張基準
: キューがウィンドウまたはディスク メモリ アラームまたはデュアルゾーンの災害復旧を超える場合は、ノードを水平に追加し、単一マシンの同時実行をスタックする代わりにラベルをコピーします。

GitHub Actions では条件で PR をホスト Runner、release/* を self-hosted ラベルへ振り分け、concurrency で同一 DerivedData の再入を防ぎます。具体例は次の YAML を参照してください。

5. 引用可能な技術情報: レビューとレビューのためのハード指標

以下の項目は、容量計画または事故レビュー資料に直接引用できます(具体的には、契約と実測が優先されます)。

ディスクのしきい値
注: キャッシュを有効にすると、DerivedData は数日で数十 GB を占有する可能性があります。継続的可用性が 10 GB 未満の場合、接続はランダムに失敗する可能性が高く、ハード アラームを発行する必要があります。

メモリと並列処理
: シングルチャネル アーカイブの一般的なピーク値は約 12 ~ 18 GB で、これは単一マシンでの並列 xcodebuild の上限を見積もるために使用されます。

ネットワークRTT
: フェッチとバイナリの依存関係が頻繁にある場合、領域が遠すぎて合計線形増幅時間を超えます。 PoC は、p95 構築とキュー待機を分離します。

剥離失敗
: クォータ、ディスク、または同時実行性の割り当てをガイドするために、署名、依存関係、OOM、アップロードが 4 つのカテゴリにタグ付けされています。

6. 3 つの推奨される組み合わせと 2 番目のノードを追加するタイミング

組み合わせA
: クラウドは提出と TestFlight をカバーし、数分以内に軽い PR をホストします。エロージョン ウィンドウをキューに入れるときに、アーカイブを実行するための専用マシンが追加されます。
組み合わせB
:PR がホストされており、
リリース/*
notarytool を使用して専用プールに移動します。一時的にノードを追加して、ピーク週のアイドル状態を緩和します。
コンビネーションC
: 専用プールは補助としてメイン ホスティングとして使用され、エクスポート エージェントは調整され、一度監査されます。ホスティングに時間を費やすだけの場合、またはクラウドをユニバーサル スクリプト マシンとして使用する場合は、キューイング、ディスク セマンティクス、クロスツール チェーンの再作業という 3 種類の隠れたコストを支払い続けることになります。オフィス用に Mac を購入するには、電源とアップグレードの負担が伴います。測定されていないスタンドアロンのセルフホスティングでは、p95 を安定させるのが困難です。 Apple のツール チェーンと予測可能な同時実行性、および VPS のような制御可能なコンピューティング パワーを必要とするチームの場合、
VPSMAC の M4 Mac クラウド ノードをレンタルする
多くの場合、排他的な NVMe と固定出力に重点を置き、ロールアウトを時間単位の SSH 配信に集中させる方が簡単です。アクティベーションとドッキングを API に近づけるには、このサイトの Mac Cloud での 90 秒の API と CI/CD ドッキングの実践を読み続けて、閉ループを完了してください。

DimensionGitHub-hosted macOSXcode CloudDedicated Mac cloud
Billing modelPer-minute execution, spiky at peakApple plan and workflow minutesHost lease plus traffic, steady CPU friendly
Queue riskOrg quotas and shared poolsTier and concurrency ceilingsYou set labels; risk shifts to resource contention
Customization depthYAML within image limitsTight Xcode workflow couplingFull shell, launchd, disk, egress policy
Signing postureGitHub secrets modelApple-managed paths reduce keychain toilUnattended match or API keys with enterprise PKI
Best-fit signalLight PR checks, bursty loadASC-centric shipping teamsHeavy archives, enterprise nets, stable p95
実践ヒント:README にブランチとラベルの責務を書き、release/* は専用ラベル、既定 PR はホスト、夜間回帰は Xcode Cloud など役割を固定する。
jobs: ios-pr: if: github.event_name == 'pull_request' runs-on: macos-14 timeout-minutes: 45 steps: - uses: actions/checkout@v4 - run: xcodebuild -scheme App -destination 'platform=iOS Simulator,name=iPhone 16' build ios-archive: if: startsWith(github.ref, 'refs/heads/release/') runs-on: [self-hosted, macOS, ARM64, pool-prod] concurrency: group: ios-archive-${{ github.ref }} cancel-in-progress: false timeout-minutes: 120 steps: - uses: actions/checkout@v4 - run: xcodebuild -scheme App -configuration Release archive