GitHub Pull Request マージキュー(beta)を試す

| 3 min read
Author: masahiro-kondo masahiro-kondoの画像

GitHub で PR のマージキューがパブリックベータになりました。

Pull request merge queue (public beta) | GitHub Changelog

Information

2023年7月12日にマージキューが GA になりました。

GitHub merge queue is generally available | The GitHub Blog

マージキューの概要

#

ブランチを作成してから PR を作成するまでに発生した main ブランチの変更を取り込む必要があるケースはけっこうあります。特に規模の大きい開発ではマージの作業コストは大きくなります。マージキューの ChangeLog の文章には以下のように書かれています。

開発者はマージ前に PR ブランチを更新して、マージ時に変更が main ブランチを壊さないようにする必要がしばしばありました。PR ブランチ更新のたびに、CI によるチェックの新たなラウンドが発生し、開発者がマージを試みる前に終了する必要がありました。別の PR がマージされた場合、すべての開発者はプロセスを再度実行する必要があります。
マージキューは、マージのためにキューに入れられた各 PR がキュー内の先行する PR でビルドされるようにすることで、このプロセスを自動化します。

つまり、PR を作成したらマージする代わりにマージキューに投入することで、投入された PR の順に必要なチェックを実行し main ブランチが壊れないようマージしてくれます。

リポジトリでマージキューを有効化する

#

ブランチプロテクションルールに Require merge queue が Beta ラベル付きで追加されています。

Information

パブリックベータの段階では、有償プラン・無償プランを問わず Organization の public リポジトリでの利用が可能なようです。

リポジトリの Settings > Branches と開き、Add branch protection rule をクリックします。

Add branch protection rule

Branch name pattern に main を入力。

branch name pattern

Require merge queue にチェックを入れます。Merge method は Squash and mergeRebase and merge を選択する必要があります。Only merge non-failing pull requests もチェックを入れないと CI が通らない PR がマージされてしまいます。

Require merge queue

Create をクリックすると、Branch protection rules が main ブランチに追加されます。

Rule created

GitHub Actions ワークフローの準備

#

GitHub Actions ワークフローのトリガーに merge_group が追加されています。このトリガーを使うと PR がマージキューに追加されたときにワークフローを起動できます。

マージキューの管理 - GitHub Docs

以下のように、ワークフローファイルを作成しました[1]。トリガーとして、pull_requestmerge_group を追加し、PR 作成時とマージキュー投入時にテストが実行されるようにしています。

  • .github/workflows/ci.yml
name: CI

on:
  pull_request:
  merge_group:

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v3
    - name: Setup Deno
      uses: denoland/setup-deno@v1
      with:
        deno-version: v1.x
    - name: Test
      run: deno test

PR を作ってマージキューに投入してみる

#

PR を作ると、従来の Merge Pull Request ボタンが、Merge when ready になっています。

Merge when ready

Merge when ready をクリックしさらに Confirm merge when ready をクリックすると、マージキューに入り、しばらくするとマージが終わります。

Queued to merge...

Information

後続の PR が先行の PR とコンフリクトする時は、マージキューから自動的に除外されます。この場合、開発者がコンフリクトを解消する必要があります。コンフリクトを解消したら、Merge when ready がクリックできるようになります。

has conflicts

複数の PR をマージキューに投入する

#

複数の PR を矢継ぎ早に投入してキューの様子を見てみます。

キューに先に投入する1つ目の PR です。

PR#9

2つ目の PR です。

PR#10

2つの PR をマージキューに入れて Merge queue の画面を見てみました。

Merge queue

サンプルプロジェクトではテストがあっという間に終わるので、一瞬で2つの PR がマージされていました。時間のかかる CI なら、自分の PR がどの辺にいるかをこの画面で確認することになります。

2つの PR をキューに投入した時のワークフローの実行履歴です。2つの PR を作成したので、PR 作成時とマージキューへの投入時で4つの履歴ができるかと思いましたが、それぞれ1度ずつ2つでした。

Action History

PR のタイムラインにはマージキュー投入後にチェックがパスしたとあります。推測ですが、PR 作成時のワークフローをリランしているのではないかと思います。

timeline

最後に

#

以上、GitHub の Pull Request マージキューを設定して試してみました。実際のプロジェクトで使ってみないと実感はしづらいですが、PR を作って CI が通ってしまえばあとはキューに入れて順番待ちというのはかなり精神的に楽だろうなあと思います。


  1. このお試し用リポジトリでは、Deno のコードをビルド・テストしています。 ↩︎

豆蔵では共に高め合う仲間を募集しています!

recruit

具体的な採用情報はこちらからご覧いただけます。