Open8
merge queue の挙動確認
pull request が merege queue に追加されると一時ブランチが作成される。
複数の pull request を順番に merge queue に追加した場合の正常系動作
- pull request #1 を merge queue に追加
- ターゲット ブランチと pull request #1 からのコード変更を含む一時ブランチが作成される
- pull request #2 を merge queue に追加
- pull request #1、pull request #2 からのコード変更を含む一時ブランチが作成される
- 一時ブランチがターゲット ブランチに merge される
複数の 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
pull request を 3 つ用意して、順番に merge する
pull_request.dequeued で動作した workflow の一部 cancel された
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"
}
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"
}
結論
複数の 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 される