Timee Product Team Blog

タイミー開発者ブログ

マージキュー対応の概要

GitHubマージキュー導入時のGitHub Actions CI設定変更

こんにちは、タイミーでPlatform Engineerをしている近藤です。
今回は、GitHubのマージキュー(Merge Queue)に対応するために、GitHub ActionsのCI設定を修正した話を紹介します。

TL;DR

GitHubのマージキュー(Merge Queue)を導入する場合、以下の設定が必要です。

  1. Rule Sets(Branch protection rule)で「Require status checks to pass」を有効化
  2. 「Merge Queue」の有効化
  3. CIワークフロー(ci.yml)の変更
    • merge_group イベントの追加
    • gh-readonly-queue/** ブランチをpushイベントから除外

GitHub Actionsの従来のCIワークフロー

まず、従来のCIワークフロー(ci.yml)の設定を振り返ります。元々の設定は以下のようになっていました。

name: ci

on:
  push:
    branches:
      - '**'
      - '!master'
    tags-ignore:
      - '*'

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

permissions:
  id-token: write
  contents: read
  pull-requests: write

jobs:
  ci:
    uses: ./.github/workflows/_ci.yml
    secrets: inherit

この設定では、masterブランチ以外のすべてのpushイベントでCIが実行されます。

デプロイまでの従来の流れ

タイミーのdeployワークフローはGitHub Flowを採用していたため、以下のような流れになっていました。

  1. PRを作成し、CIが通ることを確認。
  2. PRをmasterブランチにマージ。
  3. マージによってmasterにpushが発生し、デプロイ用ワークフロー(deploy_prod.yml)が実行される。

deploy_prod.ymlは次のようになっています。

name: deploy_prod

on:
  push:
    branches:
      - master

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      # デプロイ処理...

GitHubでの設定変更(Rule Sets)

マージキューを使うには、GitHubの設定画面から「Rule Sets」(従来はブランチプロテクションルール)を設定します。 多くのケースではすでにステータスチェック必須(Require status checks to pass)の設定がされていると思いますので、その場合は「Merge Queue」を追加でONにするだけです。

GitHub ActionsのCIワークフロー変更

PRからマージキューに積まれた際、gh-readonly-queue/xxxxというブランチが作成されるため、CIワークフロー(ci.yml)に以下の変更が必要になりました。

name: ci
 
 on:
   push:
     branches:
       - '**'
       - '!master'
+      - '!gh-readonly-queue/**'
     tags-ignore:
       - '*'
+  merge_group:
 
 concurrency:
   group: ${{ github.workflow }}-${{ github.ref }}
   cancel-in-progress: true
 
 permissions:
   id-token: write
   contents: read
   pull-requests: write
 
 jobs:
   ci:
     uses: ./.github/workflows/_ci.yml
     secrets: inherit

ポイント

  • merge_groupイベントを追加することで、マージキューにエンキューされたときにCIが実行されます。
  • gh-readonly-queue/**を除外することで、不要な二重実行を防ぎます。

注意点

merge_groupイベントは単独で定義できず、必ず他のイベントと一緒に定義する必要があります。

GitHub公式ドキュメント - merge_group

The merge_group event cannot be the only event defined in a workflow.

変更が不要なワークフロー

デプロイ系ワークフロー(例:deploy_prod.yml)など、masterブランチへのpushのみで動作するワークフローは、マージキュー対応後も変更不要です。

おわりに

GitHubのマージキューは導入が比較的簡単ですが、既存のGitHub Actionsにも影響を与えます。本記事を参考に、スムーズにマージキューを導入していただければ幸いです。 最後までお読みいただき、ありがとうございました!