公開やリリースのたびにMac Runnerの待ち時間が伸び、台数を増やしてもキューが解消しない。
最短の解決策は、長期稼働する共有Runnerを単純に増やすのではなく、基礎温存プールとキュー連動の弾性ノードを組み合わせることです。
この記事は、iOSビルドの待ち時間、リリース集中時の容量不足、Macノードの利用率を管理する研发效能責任者向けです。GitHub Actionsの権限・認証情報・監査を担当する企業ITやセキュリティ責任者、固定購入・Macレンタル・混合構成を比較する技術責任者にも適しています。
最終更新:2026年8月21日。機能状態とAPIの説明は、GitHub公式のself-hosted runnerドキュメント、公式リポジトリ、Runner APIドキュメントを再確認しています。
導入前に決めるべき自動スケールの境界
GitHub Actions macOS Runner 自動スケールが必要かどうかは、開発者数ではなく、キューの継続時間、ピーク時のジョブ種別、Macの準備時間、リリースSLAで判断します。平均待ち時間だけを見ると、短時間の急増や署名処理の滞留を見落とします。
常時オンラインの共有Runnerには、次のような制約があります。
- 前のジョブが残したワークスペース、依存ファイル、Keychain設定が次のジョブへ影響する可能性があります。
- 本番署名用の証明書や秘密情報を、公開リポジトリ由来の処理と同じホストへ置くと、Pull Request経由のコード実行範囲が広がります。GitHubの安全利用ガイドでも、self-hosted runnerではワークフローの信頼境界を確認するよう求めています。
- 台数を固定すると、ピーク時は待ち時間が増え、閑散時はアイドル状態のMacに費用と保守工数が発生します。
- Mac主機の起動、OS初期化、Xcode導入、廃棄はRunner制御面の責務ではありません。
したがって、役割を次の3層へ分けます。
- 基礎温存プール:短い検証や通常時のジョブを受ける、少数の準備済みノードです。
- 弾性ノード:キュー増加時だけ調達し、ジョブ完了後に回収するMacです。
- 固定署名ノード:本番署名、物理デバイス、厳格な認証情報を必要とする処理を限定的に受けます。
Runner Scale Set Clientは、macOSを含むカスタムRunnerの自動スケールを組み込むための制御面コンポーネントです。Macの購入、レンタル契約、起動、OS初期化、破棄を直接代行するものではありません。公式リポジトリでは、2026年8月21日時点でPublic Previewとして案内されているため、将来のGA時期や仕様固定を前提に設計しないでください。公式リポジトリの状態と説明を導入前に確認します。
最初の1時間で組織ルートと信頼境界を作る
self-hosted runnerのアクセス範囲を先に分ける
Runner groupは、リポジトリや組織単位で利用可能なRunnerを制限するために使います。Xcodeの世代、Apple SiliconなどのCPUアーキテクチャ、署名の有無、コードの信頼度を、同じタグだけで表現しないことが重要です。
例えば、通常ビルド用にはmacosとapple-silicon、署名処理には別のRunner groupと専用タグを割り当てます。タグが曖昧だと、署名用ノードへ通常のPull Requestジョブが流れる可能性があります。Runner groupのアクセス制御に沿って、組織、リポジトリ、ワークフローの許可範囲を記録してください。
認証には、権限を絞ったGitHub Appまたは公式要件に合うトークンを使い、登録、撤回、秘密情報のローテーション担当を明確にします。公開リポジトリ、または実行内容を信頼できないPull Requestは、本番証明書を保持するMacへ直接ルーティングしてはいけません。
GitHub ActionsのmacOS self-hosted runnerをキューで増やす考え方
キューの増加を検知する制御面と、Macを実際に用意する資源調達面を分離します。GitHubのWebhookはジョブ発生イベントを受ける入口、REST APIはRunner状態の確認やJIT設定取得などの補助、Runner Scale Set Clientはスケール要求とRunnerライフサイクルの連携に使います。self-hosted runner REST APIの対象操作と権限を確認し、Webhookだけで登録完了と判断しないでください。
最小限のワークフロー側は、ルーティング条件を明示する程度に留めます。
jobs:
build:
runs-on: [self-hosted, macos, apple-silicon]
steps:
- uses: actions/checkout@v4
- name: Build
run: ./ci/build-ios.sh
実際のバージョンやActionの採用可否は、組織の承認済み基準と公式ドキュメントで確認します。Xcodeと対応OSの組み合わせは固定せず、AppleのXcodeシステム要件を基準にイメージを更新してください。
初日に接続するキュー制御とMac資源調達
第二段階:状態機械で重複起動を防ぐ
拡張処理は、次の状態を持つ状態機械として実装します。
- 需要発生:キューまたはWebhookからジョブ要求を受け取ります。
- ノード要求:必要なラベルと信頼境界を付けて、Mac資源調達へ依頼します。
- 主機準備完了:起動、ネットワーク接続、OS・Xcode基準、監視接続を確認します。
- Runner登録:JITまたはephemeral設定で一度だけ登録します。
- ジョブ取得:指定されたラベルに一致するジョブだけを受けます。
- 終了処理:Runnerを撤回し、ワークスペースと一時認証情報を消去してノードを回収します。
同じWebhookを二度受けた場合は、ジョブIDや内部要求IDをキーにして一つの調達要求へまとめます。ノード起動失敗、登録タイムアウト、ジョブ取消しも別々の終了状態として記録し、再試行で同じMacを二重に作らないようにします。
Runner Scale Set Clientは、Macノードそのものを管理する仮想化基盤ではありません。企業側の自動化、既存の資源管理、またはKVMFLUXのようなMacレンタル資源への接続方式を、調達アダプターとして別に設計します。利用可能なMacの構成や契約条件を確認するときは、KVMFLUXの利用シーンも参照できます。
常駐Runnerとephemeral runnerはどう分けるか
通常の検証では、準備済み温存プールの常駐Runnerが短い待ち時間に向いています。一方、ジョブごとに環境を使い捨てるephemeral runnerは、前処理の残留や認証情報の持ち越しを抑えやすく、GitHubも自動スケール時にはephemeral self-hosted runnerを優先する設計として説明しています。self-hosted runnerの公式説明に従い、ジョブ終了後の自動撤回を本番基線にします。
常駐ノードを署名処理へ流用する場合は、毎回のワークスペース削除だけでは不十分です。Keychain、プロビジョニングプロファイル、環境変数、キャッシュのうち、再利用可能なものとジョブ終了時に必ず破棄するものを台帳化します。
一条の流水線で登録から回収までを検証する
本番リリースへ接続する前に、管理対象のテストリポジトリで一連の流れを確認します。目的はビルド成功ではなく、タグルーティング、JITまたはephemeral登録、ジョブ実行、Runner自動撤回、ワークスペース清掃が一つの閉じた処理になっていることの証明です。
Xcode、SDK、依存関係キャッシュ、Keychainは、追跡可能な基準イメージから作成します。Apple Silicon向けバイナリとIntel向け処理を同じタグへまとめず、アーキテクチャをジョブ条件として明示します。
ログはRunnerが終了した後も残るよう、外部ストレージへ送ります。最低限、Runnerアプリログ、スケール要求、Macのライフサイクル、ジョブID、撤回結果を関連付けます。GitHubの監視とトラブルシューティングでは、Runnerの状態や通信問題を切り分けるための確認項目が整理されています。
初回検証のチェックリスト
- [ ] 信頼度、Xcode環境、CPUアーキテクチャごとにRunner groupとタグを分けた
- [ ] 公開リポジトリと本番署名ジョブの経路を分離した
- [ ] JITまたはephemeral登録後、ジョブ終了時にRunnerが撤回される
- [ ] ワークスペース、Keychain、一時トークンの消去結果を確認した
- [ ] 重複Webhook、起動失敗、登録タイムアウト、取消しを再現した
- [ ] Runner終了後も外部ログからジョブと主機の履歴を追跡できる
- [ ] XcodeとSDKの基準イメージ、更新担当、ロールバック手順を記録した
第一週に温存容量と障害回収を調整する
「iOS構築のピークにはMac Runnerを何台残すべきか」という問いに、負荷データなしで固定台数を当てはめることはできません。直近のジョブ到着数、ジョブ継続時間、Mac交付時間、許容待ち時間を記録し、通常時にすぐ処理すべきジョブ数を温存プールの初期値にします。
判断は次の順に行います。
- 待ち時間が増え、準備済みMacが空いていない場合は、弾性ノードの要求条件を緩めます。
- ノード交付が遅く、ピークが短い場合は、温存プールを増やす候補にします。
- 閑散時のアイドル時間が長い場合は、縮小までの冷却時間を短くします。
- 署名処理だけが滞留する場合は、全体を増やさず固定署名ノードの容量を分離します。
固定保有と按時のMacレンタルを比較するときは、月額だけでなく、アイドル時間、交付待ち、OS・Xcode更新の担当工数、故障交換、公開遅延のリスクを同じ表に入れます。KVMFLUXの料金情報を確認する場合も、実際の必要台数、利用期間、地域、交付条件を自社の記録と照合し、節約率を先に仮定しないでください。
| 資源層 | 主な用途 | Runner方式 | 拡張・回収の判断 |
|---|---|---|---|
| 基礎温存プール | 通常の検証、短いビルド | 常駐または準備済みephemeral | 通常時の待ち時間とアイドル時間で調整 |
| 弾性ノード | リリース集中、急なキュー増加 | 原則ephemeral | キュー、交付時間、上限を組み合わせて要求 |
| 固定署名ノード | 本番署名、厳格な資格情報 | 隔離した専用Runner | 署名ジョブの並列数と監査要件で決定 |
第一週には、制御面の停止、Macノードの切断、Runner更新失敗、タグ誤配分、ジョブ後の未清掃を個別に演習します。障害時に自動再試行するだけでなく、上限を超えたノード要求を止め、署名処理を安全側へ退避できることが必要です。
本番受入と段階的な放量をどう進めるか
本番受入では、Runnerがオンラインになったかだけを合格条件にしません。次の順で対象ジョブを広げます。
- 署名を伴わないテストビルドを許可します。
- 信頼済みブランチのビルドと依存関係キャッシュを許可します。
- 本番署名を独立ノードへ移し、認証情報、ログ、回収証跡を確認します。
- 失敗回収、容量上限、ロールバックを確認した後、対象リポジトリを増やします。
合格記録には、ルーティング、単一ジョブ隔離、認証情報境界、ログ完全性、失敗時の回収、容量上限を含めます。条件を満たさない場合は、弾性ノードを増やす前に温存プールやタグ設計へ戻ります。
ここまでの記録を使って、Macノード数、許容交付時間、レンタル周期を一枚の表にまとめてください。固定購入のノードだけではピーク対応と更新作業が重くなり、すべてを弾性化すると交付待ちや外部依存が増えるため、基礎温存プールを残した混合構成が現実的です。必要な期間だけMacを確保できるかを確認する段階では、KVMFLUXの企業向けMac利用案内を候補の一つとして照合できます。
GitHub Actions macOS Runner 自動スケールは、Runnerの台数を増やす機能だけではありません。キュー検知、Mac資源の交付、JITまたはephemeral登録、ジョブ後の消去、外部ログ、失敗回収を一つの運用契約として設計して初めて、企業のiOS CI/CDで使える基盤になります。
現在の固定Mac中心の構成には、ピーク時の待ち時間、閑散時のアイドル費用、更新・故障交換の運用負担が残ります。反対に、すべてを即時レンタルへ置き換える必要もありません。まず温存容量とピーク容量を分け、必要なMacノード数、交付時間、レンタル周期を整理したうえで、KVMFLUXが弾性プールを担えるかを比較すると、既存ノードを残すべき範囲も含めて判断できます。
KVMFLUXで、Mac開発環境を柔軟に拡張できます
KVMFLUXのリモートMacなら、ビルドやリリース処理の増加に合わせて、必要な開発環境を柔軟に利用できます。 常時利用する環境と追加のノードを使い分けることで、待ち時間を抑えながら運用コストも管理できます。 専用のMac環境を活用し、環境差異や共有環境に伴う情報管理のリスクを抑えた開発体制を構築できます。 チームの規模や処理量に適したプランを選び、KVMFLUXで安定したMac開発基盤を始めてみませんか。