GitHubのPull request merge queueを試す
これ
Pull request merge queue (public beta) | GitHub Changelog
マージキューの機能はOrganizationのパブリックリポジトリまたはGHECのプライベートリポジトリで使えるらしい。個人じゃダメなのか〜
Pull request merge queues are available in any public repository owned by an organization, or in private repositories owned by organizations using GitHub Enterprise Cloud. For more information, see "GitHub's products."
https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/incorporating-changes-from-a-pull-request/merging-a-pull-request-with-a-merge-queue
関連
GitHub の merge queue を試してみて分かったこと | by Seiya Kokushi | Feb, 2023 | Medium
大まかな流れ
-
merge_group
トリガーで動作するワークフローを用意する-
pull_request
あるいはpush
トリガーとの併用を推奨[1]
-
- ターゲットブランチにbranch protection rulesを設定する
-
Protect matching branches
->Require merge queue
を有効化- パラメータは都度調整する
-
Protect matching branches
->Require status checks to pass before merging
を有効化-
Status checks that are required.
にPRが溜まったキューで必ずパスしたいstatus checksを設定する(1. で用意したやつ)[2]
-
-
-
Require merge queue
を有効化したブランチに対するプルリクエストにMerge when ready
というボタンが現れ、キューに貯められるようになる-
Merge when ready
を押すとstatus checksが通ると自動でキューに入る状態になる(auto mergeと同じ) -
Require status checks to pass before merging
で有効にしたstatus checksを突破しないといけない - そのため、
merge_group
以外にpull_request
あるいはpush
が必要となる
-
- マージキューにPRが増えると、
merge_group
トリガーで動作するワークフローが発火する。一つのブランチにマージされたPR群に対してワークフローが実行される-
Require status checks to pass before merging
で有効にしたstatus checksを突破するとターゲットブランチにマージされる
-
- GitHub Actions以外のCIというかstatus checksでも使えるけど、その場合はブランチ名に条件があるらしい(参考)。まだ試してない。
プルリクでMerge when ready
ってボタンが出るらしいが、GHESのリポジトリで見てもそんなものはない。
Repository administrators can require a merge queue by enabling the branch protection setting "Require merge queue" in the protection rules for the base branch. For more information, see "Managing a branch protection rule."
https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/configuring-pull-request-merges/managing-a-merge-queue#managing-a-merge-queue
branch protectionでマージキューを設定しないとダメかも。
required-merge-queue
というブランチを対象に保護ルールを作ってみるよ
Protect matching branches にいた
設定あったね〜
- Merges to matching branches must be performed via a merge queue. | 一致するブランチへのマージは、マージキューを経由して行わなければなりません。
- Merge method
- Method to use when merging changes from queued pull requests. | キューに入れられたプルリクエストから変更をマージする際に使用するメソッド。
- Merge, Squash, Rebase から選べる
- Method to use when merging changes from queued pull requests. | キューに入れられたプルリクエストから変更をマージする際に使用するメソッド。
- Build concurrency
- Limit the number of queued pull requests building at the same time. | キューに入れられたプルリクエストを同時に構築する数を制限することができます。
- Maximum pull requests to build:
X
| ビルドするための最大プルリクエスト数。- デフォルト値は
X
が5
- デフォルト値は
- Merge limits
- Limit the number of pull requests merged into the protected branch in a single merge operation. | 一度のマージ操作でprotectedブランチにマージされるプルリクエストの数を制限します。
- Minimum pull requests to merge: X or after Y minites | マージするプルリクエストの最小値。XまたはY分後
- デフォルト値は
X
が1
、Y
が5
- デフォルト値は
- Maximum pull requests to merge:
Z
| マージするプルリクエストの最大数。- デフォルト値は
Z
が5
- デフォルト値は
- Only merge non-failing pull requests | 失敗していないプルリクエストのみをマージする
- デフォルト
true
- デフォルト
- Minimum pull requests to merge: X or after Y minites | マージするプルリクエストの最小値。XまたはY分後
- Limit the number of pull requests merged into the protected branch in a single merge operation. | 一度のマージ操作でprotectedブランチにマージされるプルリクエストの数を制限します。
- Status check timeout | ステータスチェックのタイムアウト
- Time (in minutes) a required status check must report a conclusion within to not be considered failed. | ステータスチェックが失敗したとみなされないために必要な時間(分単位)。
- Consider check failed after:
X
minutes | チェックに失敗したと考えてください。X` 分- デフォルトは
X
が60
- デフォルトは
- Consider check failed after:
- Time (in minutes) a required status check must report a conclusion within to not be considered failed. | ステータスチェックが失敗したとみなされないために必要な時間(分単位)。
とりあえずデフォルトのままチェック入れてみる。
required-merge-queue
ブランチに対する適当なプルリクを作ったよ。
Merge when ready
ボタンが生えた
Confirm merge when ready
で確認される
速攻でマージされた笑
merge queueのページ
履歴はないっぽい
速攻すぎてアレなのでちょっと設定を見直そう
Minimum pull requests to merge
が1
に設定されているせいかもな〜
にしても瞬間でマージされるとは思わなかった。
相当動きの速いリポジトリが想定されてそう。
ステータスチェックが終わってたのも関係してそう。
とりあえずMinimum pull requests to merge 3 or 5 minutes
に設定してみる。
別のプルリクエストを作成
3個溜まったら自動でマージされた
おそらく5分以上経ったら、maxにならなくてもマージされる。
次はキューに溜まった時のCIを設定したい
GitHub Actionsでキューに溜まったものをまとめてテストする
on.merge_group
を設定するよ
You can use the merge_group event to trigger your GitHub Actions workflow when a pull request is added to a merge queue. Note that this is a different event from the pull_request and push events.
https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/configuring-pull-request-merges/managing-a-merge-queue#triggering-merge-group-checks-with-github-actions
とりあえず作った。
# testing required workflow
# https://github.blog/changelog/2023-01-10-github-actions-support-for-organization-wide-required-workflows-public-beta/
on:
merge_group:
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- run: ls
- run: sleep 60
Ready when mergeしたけど、走らなかった。
先にベースブランチに存在する必要がありそう。
Minimum pull requests to merge 3 or 5 minutes
に設定してるので5分まつか
5分経ってマージされた
プルリクを3つ用意
- merge queueの実験だよ 5 by korosuke613 · Pull Request #12
- merge queueの実験だよ 6 by korosuke613 · Pull Request #12
- merge queueの実験だよ 7 by korosuke613 · Pull Request #12
まずは5, 6をMerge when readyする
2個追加した時点ではまだ走らない。
3個目いってみるか
...
あれーマージされてしまった。
CIは走らなかった
3日くらい前になんか不具合修正あったっぽいけどよくわかんねえな
Pull Request Merge Queue Public Beta Feedback · Discussion #46757 · community/community
再実験
簡単にするために、Minimum pull requests to merge: 2
にする
また、pull_request
イベントで動くワークフローをrequired
にした。
merge_group
動いた。
キューにあるプルリクaで追加したaaaaa
とプルリクbで追加したbbbb
というファイルがちゃんとある。
よくわからんけど直ったっぽい
ただ、ずっとぐるぐるしている。
おそらくこれのせい
また、pull_requestイベントで動くワークフローをrequiredにした。
https://zenn.dev/link/comments/77a69c5cb7b912
pull_request
はトリガーされないからか。
merge queue 内で GitHub Action を動かすには Require status checks to pass before merging で動かしたい job を指定しておく必要がある。
これを指定しておかないと、merge queue に PR の変更が詰められても、ステータスチェックを待たずにベースブランチにマージされてしまう。
さらに、ここに指定する job の workflow は、先述の merge queue 追加時のイベントがないと、merge queue 追加時に job がトリガーされない。そのため、ステータスチェックが終わらずベースブランチにマージできないという現象が発生する。
https://medium.com/@ronnnnn_jp/github-の-merge-queue-を試してみて分かったこと-5c5b94cf477b
有識者のサイトにも書いてあった。
マージキューにおいてrequiredにするのはmerge_group
のジョブだけがいいっぽい。
requiredをmerge_group
のジョブのみに変更。
1分くらい経ったらマージされた!
再度実験。
あーrequiredをmerge_group
のみにすると、プルリクエストをMerge when ready
にするときにジョブが走らないのにrequiredとなってしまう。
結局、merge_group
単体で使うのは不便で、push
やpull_request
と併用せざるを得ない感じか。
まとめた。
# testing required workflow
# https://github.blog/changelog/2023-01-10-github-actions-support-for-organization-wide-required-workflows-public-beta/
on:
merge_group:
pull_request:
jobs:
required-test-merge-group:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- run: ls
- run: sleep 60
merge_group
に関しては、マージキューにキューが入るたびにイベントが発火するらしいらしい。
準備(キューに入ってるPRの最小を超える or 待ち時間を超える)ができてからイベントが発火するわけではないのか
キューに溜まったプルリクを選んで強制的にマージすることもできるっぽい
Triggering merge group checks with other CI providers
With other CI providers, you may need to update your CI configuration to run when a branch that begins with the special prefix
gh-readonly-queue/{base_branch}
is created.
他のCIで扱うこともできるが、その場合はブランチ名がgh-readonly-queue/{base_branch}
でないといけないらしい。