GitHub merge queue とは、PR を列に並べ、前の PR と重ねて試験してから入れる仕組みです。
- merge queue の設定の項目(同時に組む数・組の大きさ・待ち時間)と、Actions を
merge_groupで動かす書き方 - AI の席が PR を量産する当社で、列 37 本のうち先頭が 20 分動かなかった時の数字
- 同時に組む数を 6 から 12 に上げても main に入る本数が増えなかった理由と、揺れる試験 1 本が無関係な PR を列から落とした記録
AI に開発の仕事を任せる考え方は AIエージェント の頁に、席を並べて動かす手順は Claude Code の並列実行 の頁にまとめています。この頁は、並べた席の PR が main に入る手前の列だけを扱います。
merge queue の設定の項目と、当社が触った所
merge queue は、列に入った PR を前から順に main と重ねた一時の枝(gh-readonly-queue/ で始まる枝)に組み、必須の試験が通った物から統合します。組んだ物の試験が落ちると、その PR は列から外され、後ろの組は外した PR を抜いて組み直されます(Managing a merge queue・2026-10-30 に開いて確かめた)。
| 設定の画面の名前 | ruleset の項目 | 何を決めるか | 幅 | 当社の記録 |
|---|---|---|---|---|
| Build concurrency | max_entries_to_build | 同時に試験と workflow の run を求める PR の数 | 0〜100(画面は 1〜100) | 6。12 に上げて効かず、6 に戻した(下の節) |
| Minimum / Maximum group size | min_entries_to_merge・max_entries_to_merge | 一度に統合する PR の数の下と上 | 0〜100(画面は 1〜100) | 触っていない |
| Wait time | min_entries_to_merge_wait_minutes | 最初の PR が入ってから、組の下限が揃うのを待つ時間 | 0〜360 分 | 触っていない |
| Status check timeout | check_response_timeout_minutes | 必須の試験の答えを待つ上限。過ぎると落ちた扱い | 1〜360 分 | 触っていない |
| Merge method | merge_method | merge・squash・rebase のどれで入れるか | 3 つから 1 つ | 触っていない |
出典: Managing a merge queue・REST API endpoints for rules(どちらも 2026-10-30 に開いて確かめた)。当社の記録の列は 出典: 社の実測 2026-10-21(当社の CI の記録)。
GitHub Actions で必須の試験を回しているなら、workflow の起動の条件に merge_group を足します。足さないと、列に入った PR の試験が始まらず、必須の試験の答えが返らないまま統合が落ちます。merge_group は pull_request や push とは別のイベントです(Events that trigger workflows・2026-10-30 に開いて確かめた)。
on:
pull_request:
branches: [main]
merge_group:
types: [checks_requested]
branches: [main]
出典: Events that trigger workflows の merge_group の例(2026-10-30 に開いて確かめた)。
AI の席に PR を列へ入れさせた時、本当に列に入ったかをどこで確かめるかは GitHub MCP の頁に書いています。この頁はその先、列に入った後の話です。
当社の記録: 列 37 本、先頭が 20 分動かない
2026-10-21、列には 37 本の PR が並んでいました。組まれていたのは前の 6 本だけで(max_entries_to_build が 6)、先頭が 20 分動きませんでした。AI の席の手は止まっておらず、PR は書かれ続けているのに、main に入る仕事が進まない形です(出典: 社の実測 2026-10-21(当社の CI の記録))。
人が書く PR なら、1 日に列へ入る本数は限られます。AI の席を並べると、書く速さが列の進む速さを超えます。列の詰まりは、席の数を増やしても解けません。そこで、1 組が何に時間を使っているかを数えました。
| 数えた物 | 値 |
|---|---|
1 組(merge_group)の所要 | 中央 19.8 分・最大 31.1 分 |
| 1 組が始まりに求める job | 約 12 本を一度に |
| 1 組に同時に要る作業員(runner) | 平均 3.3〜3.5・最大 6〜8 |
| 赤(試験が落ちた)の組 | 完了 50 組のうち 16 組(32%) |
| 赤の出どころ | 赤の 6 本のうち 5 本は、同じ結合試験 1 本 |
出典: 社の実測 2026-10-21(当社の CI の記録・直近 3 時間に完了した 50 組)。
1 組に 20 分前後かかり、3 組に 1 組は赤で落ちる。落ちれば、その組の後ろは組み直しになります。赤の大半は、同じ結合試験 1 本から出ていました。
同時に組む数を 6 から 12 に上げても、入る本数は増えなかった
列の前で組まれる数が 6 に絞られているなら、上げれば流れる。そう考えて max_entries_to_build を 6 から 12 に上げ、上げる前の 1 時間と後の 1 時間を比べました。
| 数えた物 | 6 の 1 時間 | 12 の 1 時間 |
|---|---|---|
| main に入った PR(同じ数え方) | 20 本 | 13 本 |
| 赤の組の割合 | 44% | 44% |
| 作業員の待ち | 中央 1.0 分 | 中央 2.3 分(最大 15.9 分) |
出典: 社の実測 2026-10-21(当社の CI の記録)。
入る本数は増えず、作業員の待ちが延びました。理由は 2 つありました(出典: 社の実測 2026-10-21(当社の CI の記録))。
- 古い run が取り消されずに残る。赤の組で後ろが組み直される時、前の組で走っていた run が取り消されず、作業員を持ったまま残っていました。同じ PR の run が 2 本ずつ走っていました
- 作業員の数には上限がある。1 組が始まりに約 12 本の job を求めるので、組む数を倍にすると求める作業員も増え、上限に当たって待ちになります
同時に組む数は 6 に戻しました。列の進みを決めていたのは「同時に組む数」と「揺れる試験の赤で組み直しになること」で、作業員を足しても main に入る本数は増えませんでした(出典: 社の実測 2026-10-21(当社の CI の記録))。作業員を自前で持つ時の数え方は、同じ日に出した self-hosted runner の頁に渡します。
揺れる試験 1 本が、無関係な PR を列から落とす
赤の組は、その組の PR が悪いとは限りません。当社では、E2E 試験(Playwright の Electron)が遅い作業員で後片付けの時間切れ(Worker teardown timeout 180000ms)になり、retry で試験は全部緑なのに job が exit 1 で終わっていました。そのせいで、試験と関係の無い PR 2 本が計 3 回列から外れ、入れ直すたびに 20〜40 分ずつ失いました(出典: 社の実測 2026-10-10〜11(当社の CI の記録))。
根は、ログイン画面が成功の 1.5 秒後に自分で閉じる瞬間と、次の操作が重なる所でした。遅い台ほど重なります。直したのは次の 3 つです。retry の回数と、試験を飛ばす印(skip)には触っていません。
| 直した所 | 中身 |
|---|---|
| 閉じる瞬間 | ログイン画面が閉じきるのを待ってから次の操作に進む |
| 後片付け | 20 秒の上限を付ける |
| 1 つの操作 | 30 秒の上限を付ける |
出典: 社の実測 2026-10-10〜11(当社の CI の記録)。
直した後、使い捨ての作業員で 22 本続けて緑でした(出典: 社の実測 2026-10-10〜11(当社の CI の記録))。retry を増やして赤を隠す道もありましたが、後片付けの時間切れは retry の外で起きていたので、隠せても列の赤は減りません。試験を書く席と見る席の分け方は AI テスト自動化 の頁に書いています。
作業員が消えて赤になった PR は、撃ち直しても列に戻らない
Spot の作業員(途中で回収されうる安い台)が回収されて job が赤になると、その run を撃ち直しても、列から落ちた PR は戻りませんでした。落ちて 1〜4 分後には、PR はもう列から外れていました(出典: 社の実測 2026-10-11(当社の CI の記録))。
公式の文書も、組の試験が落ちた時と、試験の答えが時間切れになった時は、PR を列から外すとしています(Managing a merge queue・2026-10-30 に開いて確かめた)。AI の席に「赤なら撃ち直す」とだけ渡すと、列から外れた PR を入れ直さないまま待ち続けます。撃ち直すより先に、PR がまだ列に居るかを見る形にしておきます。
次の手の候補(まだ効いたとは測っていない)
2026-10-21 の記録から出た次の手の候補は 2 つです。どちらも、この頁を書いた時点で効いたかを測っていません(出典: 社の記録 2026-10-21(当社の CI の記録))。
| 候補 | 狙い | 今の状態 |
|---|---|---|
組み直しの時に、古い merge_group の run を取り消す(workflow の concurrency の cancel-in-progress を merge_group にも効かせる) | 作業員を持ったまま残る run を消し、同じ PR の run が 2 本走るのを止める | 未測定 |
| 赤の大半を出している揺れる試験を直す | 組み直しの回数そのものを減らす | 未測定 |
出典: 社の記録 2026-10-21(当社の CI の記録)。
concurrency は、同じ組の名前の run を一度に 1 本だけにする設定で、cancel-in-progress: true を付けると走っている物を取り消します。公式の頁はこの例を ${{ github.workflow }}-${{ github.ref }} の組の名前で示していますが、merge_group には触れていません(Control the concurrency of workflows and jobs・2026-10-30 に開いて確かめた)。merge_group の run でどう組の名前を付ければ古い組だけが消えるかは、当社でもまだ確かめていません。
AI の席を並べる前に、列で見ておく数
当社の記録を、列が詰まった時に見る順に並べ直すと次のとおりです。
| 症状 | 見る数 | 当社で試した事 |
|---|---|---|
| 席は動いているのに main に入らない | 列の本数・組まれている本数・先頭が動かない時間 | 列 37 本・組まれていたのは 6 本・先頭 20 分(2026-10-21) |
| 同時に組む数を上げたくなる | 赤の組の割合・作業員の待ち・同じ PR の run の本数 | 6→12 で入る本数は増えず、6 に戻した(2026-10-21) |
| 無関係な PR が列から落ちる | 赤の出どころが同じ試験か | 揺れる試験を直し、22 本続けて緑(2026-10-10〜11) |
| 撃ち直しても進まない | PR がまだ列に居るか | 落ちて 1〜4 分後には列から外れていた(2026-10-11) |
出典: 社の実測 2026-10-10〜11・2026-10-11・2026-10-21(当社の CI の記録)。
よくある質問
GitHub merge queue を使うと、workflow に何を足せばよいですか?
必須の試験を GitHub Actions で回しているなら、起動の条件に merge_group を足します。足さないと列に入った PR の試験が始まらず、必須の試験の答えが返らないため統合が落ちます(Events that trigger workflows・2026-10-30 に開いて確かめた)。
merge queue の Build concurrency を上げれば、列は速く流れますか?
当社では流れませんでした。6 から 12 に上げた 1 時間は、main に入った PR が 20 本から 13 本に減り、赤の組の割合は 44% のまま、作業員の待ちは中央 1.0 分から 2.3 分に延びました。古い run が取り消されずに作業員を持ったまま残ったことと、作業員の数の上限が理由でした(出典: 社の実測 2026-10-21(当社の CI の記録))。
merge queue で、関係の無い PR が列から外れるのはなぜですか?
組の試験が落ちると、その組の PR は列から外されます。当社では、揺れる E2E 試験 1 本が後片付けの時間切れで job を赤にし、無関係な PR 2 本が計 3 回外れて、20〜40 分ずつ失いました(出典: 社の実測 2026-10-10〜11(当社の CI の記録))。
列から外れた PR は、試験を撃ち直せば戻りますか?
当社では戻りませんでした。作業員が回収されて赤になった run を撃ち直しても、PR は落ちて 1〜4 分後にはもう列から外れていました(出典: 社の実測 2026-10-11(当社の CI の記録))。列に入れ直す必要があります。
出典
- GitHub Docs「Managing a merge queue」 https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/configuring-pull-request-merges/managing-a-merge-queue(2026-10-30 に開いて確かめた・列の仕組み・
merge_groupが要る事・設定の項目と幅・組が落ちた時と時間切れの時に列から外す事) - GitHub Docs「Events that trigger workflows」の
merge_grouphttps://docs.github.com/en/actions/reference/workflows-and-actions/events-that-trigger-workflows(2026-10-30 に開いて確かめた・checks_requested・足さないと試験が始まらない事・書き方の例) - GitHub Docs「REST API endpoints for rules」 https://docs.github.com/en/rest/repos/rules(2026-10-30 に開いて確かめた・ruleset の merge queue の項目
max_entries_to_buildほかとその幅) - GitHub Docs「Control the concurrency of workflows and jobs」 https://docs.github.com/en/actions/how-tos/write-workflows/choose-when-workflows-run/control-workflow-concurrency(2026-10-30 に開いて確かめた・
cancel-in-progress・組の名前の例) - 社の実測 2026-10-21(当社の CI の記録・列 37 本と先頭の停止・1 組の所要と job と作業員・赤の割合と出どころ・同時に組む数 6→12 の前後の 1 時間)
- 社の記録 2026-10-21(当社の CI の記録・次の手の候補 2 つ。効いたかは未測定)
- 社の実測 2026-10-10〜11(当社の CI の記録・揺れる E2E 試験が無関係な PR を列から落とした事・根と直し・直した後の 22 本)
- 社の実測 2026-10-11(当社の CI の記録・回収された作業員の赤を撃ち直しても PR が列に戻らない事)