2026 共有リモートMacでGitHub Actions:
Merge QueueとRunnerラベルをどう分け、マージ検証をPR雑務で飢餓させないか

二段キュー思考 · ラベルルーティング · concurrency · マージレーンの可観測性

2026 GitHub Merge QueueとリモートMacセルフホストRunner

複数台のレンタルしたリモートMacセルフホストRunnerを載せるとき、「Merge Queueが機械側の行列まで整列してくれる」と誤解しやすいです。GitHub側のマージキューはデフォルトブランチへの統合順序と安全ゲートを担いますが、Runner側のバックログは依然としてラベルとconcurrencyグループ次第です。本文では制御面の分担表で二つの「キュー」を切り分け、ci-pr/ci-merge/ci-releaseのラベル設計、concurrencycancel-in-progressの扱い、p95待ちからMac追加とGitHub設定のどちらを先に触るべきかの判断まで整理し、共有ビルドプール並列席ロックMac Meshタスクオーケストレーションと相互リンクします。

01

二つの「キュー」と6つの痛み:Merge Queueを入れてもマージ飢餓が残る理由

Merge Queueが守るのはデフォルトブランチの整合性です。複数PRを安全に順序付けして統合しますが、リモートMac Runnerに常に空きCPUがあることは保証しません。PR検証とマージ検証が同一のruns-onラベルを共有すると、「GitHub上はマージを進められるが、Runnerは任意のPRチェックを数本走らせている」というズレが起きます。

  1. 01

    二段キューの誤読:Actionsの「Queued」を、Merge Queueがマージジョブ優先度を自動で上げると勘違いする。

  2. 02

    ラベルの混線:ciのような曖昧ラベルにnightly・PR・mergeが同居する。

  3. 03

    誤ったキャンセル:マージレーンでPRと同じcancel-in-progress: trueを使い、バッチ途中を何度も破棄する。

  4. 04

    concurrency名の衝突:複数リポやworkflowで同一のconcurrency文字列を使い誤爆する。

  5. 05

    観測の欠如:「merge queue待ち」と「Runner稼働率」を分けず、増設議論がデータ不足になる。

  6. 06

    Meshロックとの衝突:マージレーンでノード占有を安定させるのにノードリースと揃えていない。

ヒント:まだノートPCとリモートの役割比較に留まりCI制御面まで降りていない場合は、先にローカル軽作業とリモート重コンパイルの閾値記事を読んでください。

02

制御面の分担とラベル:いつci-mergeレーンを切るべきか

次の対照表はレビュー会議用です。「両方やる」はRunner容量が正直な場合の出発点であり、ラベルでの自己欺瞞ではありません。

制御面GitHub Merge QueueRunner backlog(機械キュー)
管轄デフォルトブランチへの順序、マージバッチ、必須チェックの意味論どのMacがいつどのworkflowジョブを走らせるか
管轄外M4に性能コアがいくつ空いているかPRが論理的に割り込むべきかどうか
典型失敗論理は正しいが算力不足でバッチがタイムアウト反復queueは短いのにmergeジョブが長時間Queued
最初の手必須チェックとバッチ前提を締めるruns-onを分割しRunnerを増やすか専用席を確保

マージが滑らかかは、Merge Queueスイッチではなく、マージ用に正直な容量名をRunnerが確保できているかで決まります。

推奨ラベルパターン(チーム略称に置換可)

  • PR雑務:self-hosted + macOS + ci-pr + ツールチェーン版(例 xcode-16-2)。
  • マージレーン:同じツールチェーン版に加え、容量を偽らない接尾辞ci-mergeを付与し、少なくとも1台のリモートMac Runnerが受ける。
  • リリース/アーカイブ:ci-releaseをmergeから分離し、巨大ジョブがtrunkを飢餓させないようにする。
03

6ステップRunbook:マージレーンをYAMLで固定し口頭運用で終わらせない

次の手順は共有プールSSH記事と併走します。旧文が「Runnerに届くか」、本文が「どのCPU時間軸を誰が占有するか」を扱います。

  1. 01

    必須チェックの棚卸し:デフォルトブランチで実際にマージを止める検証を表にし、所要時間とPR段階へ前倒し可否を書く。

  2. 02

    runs-onの分割:マージ専用workflowまたはジョブへci-mergeを付与。同一物理機に複数ラベルは可だが、時間帯予約または専用ノードが必須

  3. 03

    concurrencyの確認:PR側はcancel-in-progress: trueで古いコミット検証を削ぎ、merge/release側はcancel-in-progress: falseかより狭いキー。

  4. 04

    concurrencyグループ命名:リポジトリ、workflow名、環境接尾辞を含め組織内衝突を防ぐ。

  5. 05

    計測:チームボードでGitHubの「merge queue待ち」とRunnerの「busy分」を別系列で見る。

  6. 06

    ゲート振り返り:週に2回以上「queueは短いのにmergeジョブが長Queued」なら、GitHub並列議論の前にRunnerトポロジを変える。

yaml
concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name }}
  cancel-in-progress: ${{ github.event_name == 'pull_request' }}

jobs:
  merge-gate:
    runs-on: [self-hosted, macOS, ci-merge, xcode-16-2]
    timeout-minutes: 45
    steps:
      - run: echo "merge lane only"
04

可観測性と判断材料:Macを増やすかGitHub設定か

以下はよくあるインシデントレビュー口径です。閾値は自社データに置換してください。重要なのは二種類の待ちを同一グラフに混ぜないことです。

現象想定原因第一動作
merge queueは長いがRunnerは遊んでいる必須チェックまたはバッチ戦略が厳しすぎるチェックグラフと並列前提をレビュー
queueは短いがmergeジョブが長時間Queuedラベル経路またはRunner台数不足ci-mergeを分離しノード/専用席を追加
バッチがインフラ失敗を繰り返すタイムアウト、ディスク、キーチェーン、ネット揺らぎRunnerログと署名ガバナンス照合
PRは速いがmergeが遅いPRとmergeが同一ラベルで奪い合うruns-on分割とPR任意ジョブの整理

注意:ラベルを分けずにマージ向けに「速い機械」だけ足すと、飢餓はリリース夜へ先送りされがちです。長期はやはり別の容量名が要ります。

05

引用指標と意思決定ライン(エンジニアリング確認用)

以下は多拠点チーム向けのざっくり目安です。取得SQLやAPIフィールドを社内Runbookに落としてください。

  • mergeジョブの待ち行列:連続2リリース週P95が20分超かつmerge queue深さが安定して3未満なら、GitHub並列よりRunnerラベルの正直さを疑う。
  • PR占有率:optional workflowがci-merge同名Runnerを握るとき、営業時間のbusy分が85%超ならnightlyをci-prへ寄せる。
  • キャンセル嵐:マージレーン週報で「キャンセルされたマージ検証」が週1回超なら、PRと同一concurrency戦略の混線を監査する。
チーム規模trunkマージ頻度推奨の第一手
小規模1日複数回専用ci-merge Runner1台+厳格な必須チェック
中規模バッチが途切れない多地域Runner+明示的releaseプール
プラットフォーム化複数リポで共有プール組織ラベル規範+queue対runnerのコストボード分割

ノートPCを「仮Runner」にするとスリープ・熱・監査不能な対話ログインが混ざります。自前コロケMacは調達と配線の負債になります。いずれもマージSLOを契約として追跡しにくいです。

iOS CI/CDとAIエージェント長時間タスクを同居させるリモートMacプールでは、VpsMeshのMac Miniクラウドレンタルがしばしば最適解です。リージョンとスペックでRunner Fleetを伸ばし、merge・release・日常雑務を名前付きノードに載せ、可用性と席ポリシーをチャットの暗黙知ではなく運用条項へ落とせます。

FAQ

よくある質問

物理1台独占までは不要ですが、ラベルと並行制御は正直に分ける必要があります。分けないとPR雑務がマージ検証を飢餓させます。ci-mergeを固定席または専用ノードに紐づけるのが安全です。拡張の目安は料金ページ注文ページを参照してください。

PRは新コミットで古い検証が自然失効します。マージバッチを繰り返し打ち切ると、統合済みだが自動化が閉じないリスクが膨らみます。方針をYAMLに書き、ヘルプセンターからRunbookへリンクして誤設定を減らしてください。

まず共有ビルドプールでSSHとRunner登録を閉じ、本文でマージレーンを分割してください。席ロックの詳細はmutex TTL記事を参照してください。