Open8

merge queue の挙動確認

ishii1648ishii1648

複数の pull request を順番に merge queue に追加した場合の正常系動作

  1. pull request #1 を merge queue に追加
  2. ターゲット ブランチと pull request #1 からのコード変更を含む一時ブランチが作成される
  3. pull request #2 を merge queue に追加
  4. pull request #1、pull request #2 からのコード変更を含む一時ブランチが作成される
  5. 一時ブランチがターゲット ブランチに merge される

https://docs.github.com/ja/repositories/configuring-branches-and-merges-in-your-repository/configuring-pull-request-merges/managing-a-merge-queue#successful-ci

ishii1648ishii1648

複数の pull request を merge queue に入れた場合の merge タイミングを確認したい。

例えば pull request #1、pull request #2、pull request #3 を順番に(ただしほぼ同時に) merge queue に入れた場合、CI としては後続の pull request のほうが早く終了する可能性がある。この時どういった挙動になるのかを知りたい。

想定挙動

  • 先に merge queue に入れた pull request を待つ
  • 先に merge queue に入れた pull request の CI が終了した時点でほぼ同時に merge される
  • トリガーに pull_request.dequeued を設定している場合は同時に merge された pull request の片方が concurrency.cancel-in-progress で cancel される

テストに利用する workflow

name: workflow a

on:
  merge_group:
  pull_request:
    types:
      - opened
      - synchronize
      - dequeued

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  job1:
    runs-on: ubuntu-latest
    steps:
      - run: |
          MIN=5
          MAX=15
          RANDOM_NUM=$(( RANDOM % (MAX - MIN + 1) + MIN ))
          sleep $(( RANDOM_NUM * 10 ))
        shell: bash -xeuo pipefail {0}

  status-checks:
    runs-on: ubuntu-latest
    needs: job1
    if: always()
    steps:
      - run: echo exit
ishii1648ishii1648

job の実行時間の関係で merge queue に入れた時間(created_at)と完了する時間(updated_at)が入れ替わっている

❯ gh api \
        -H "Accept: application/vnd.github+json" \
        -H "X-GitHub-Api-Version: 2022-11-28" \
        /repos/orilla1453/operation-merge-queue/actions/runs/$RUN_ID | jq '{created_at, updated_at}'
{
  "created_at": "2024-09-17T15:17:19Z",
  "updated_at": "2024-09-17T15:18:37Z"
}
❯ gh api \
        -H "Accept: application/vnd.github+json" \
        -H "X-GitHub-Api-Version: 2022-11-28" \
        /repos/orilla1453/operation-merge-queue/actions/runs/$RUN_ID | jq '{created_at, updated_at}'
{
  "created_at": "2024-09-17T15:17:18Z",
  "updated_at": "2024-09-17T15:19:50Z"
}
ishii1648ishii1648

pull_request.dequeued で動いた workflow を見ると開始時間が同時になっている

❯ gh api \
        -H "Accept: application/vnd.github+json" \
        -H "X-GitHub-Api-Version: 2022-11-28" \
        /repos/orilla1453/operation-merge-queue/actions/runs/$RUN_ID | jq '{created_at, updated_at}'
{
  "created_at": "2024-09-17T15:20:15Z",
  "updated_at": "2024-09-17T15:22:03Z"
}
❯ gh api \
        -H "Accept: application/vnd.github+json" \
        -H "X-GitHub-Api-Version: 2022-11-28" \
        /repos/orilla1453/operation-merge-queue/actions/runs/$RUN_ID | jq '{created_at, updated_at}'
{
  "created_at": "2024-09-17T15:20:15Z",
  "updated_at": "2024-09-17T15:20:17Z"
}
ishii1648ishii1648

結論

複数の pull request を merge queue に入れた場合の挙動として以下認識は正しそう

  • 先に merge queue に入れた pull request を待つ
  • 先に merge queue に入れた pull request の CI が終了した時点でほぼ同時に merge される
  • トリガーに pull_request.dequeued を設定している場合は同時に merge された pull request の片方が concurrency.cancel-in-progress で cancel される