Githubでマージキューを使用し、PRをマージ時にCIを実行する

# はじめに
Githubでマージキューの設定でいくつかつまづいた点があるので、設定方法を残しておきます。

# チェック動作のイメージ
この記事の内容を実行すると、下記のような順番で自動テストなどのチェックが走ります。
- PR作成・更新時、GithubActionsのワークフローで自動テストなどのCIを実行
- 上記のPRをマージ時、GithubActionsのワークフローで自動テストなどのCIを実行
（正確に言うと、PRをマージキューに追加し、マージする前にGithubActionsのワークフローで自動テストなどのCIを実行するという動作になります）

# Organizationでリポジトリを作成
Githubの個人アカウントだと、マージキューは使えないみたいです。
したがって、Organizationでリポジトリを作成する必要があります。
私の場合、私用のOrganizationがなかったので、新しく作成しました。
**FreeプランのOrganizationでPublicリポジトリを作成するか、Privateリポジトリにする場合は有料プラン(GitHub Enterprise)で作成する**必要があるみたいです。
Githubの設定画面のOrganizationsから無料で作成できるので、とりあえず試してみたい方はそちらから作成して、リポジトリを作成してください。
お試しで使う場合はPublicでリポジトリを作成することをお忘れなく。

# マージキュー時に使用するワークフローファイルの作成
後ほど、説明しますが、マージキュー時にワークフローを実行するために、一度ワークフローを実行しておく必要があります。
したがって、まず実行したいワークフローファイルを実行してください。

本記事ではサンプルとして、以下のようなワークフローファイルを作成します。

```yaml
name: ci

on: 
  pull_request:
  merge_group:

jobs:
  CI:
    name: CI
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      - name: Run on pull_request and merge_group
        run: echo "This step runs on pull_request and merge_group events."
      - name: Run only on merge_group
        if: github.event_name == 'merge_group'
        run: echo "This step runs only on merge_group events."
```

要点は、`on`に、`pull_request`と`merge_group`を設定するだけです。
これで、PR作成・更新時と、PRをマージキューでマージする時に実行されます。
（もし、PR作成・更新時と、PRをマージキューでマージする時に異なる内容のチェックをしたい場合は、[PR時とマージ時でチェック内容を変更したい場合](#pr時とマージ時でチェック内容を変更したい場合)を参照ください）

# Githubでマージキューを設定
- リポジトリの設定からブランチの設定を開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/ff168053-9533-1f7a-db20-616d82f8b16e.png)
- 対象のブランチを設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/930204f2-5b55-d47e-95f0-c1d83c887f28.png)
- プルリクエストを必須とする設定を追加（各項目の設定はお好みで）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/017c0543-3ef3-1f33-13f3-995faf4ba023.png)

- マージ前のチェック項目を設定(一度、ワークフローを実行していないとジョブ名が出てこないのでご注意を)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/26061095-5dbf-16fc-a3be-4c79d00fcdc1.png)
- マージキューの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/fedaef8b-3bb6-134e-2844-c8dbb00a58dd.png)

# PR時とマージ時でチェック内容を変更したい場合
同じファイル内で処理を分ける方法と、別ファイルで管理する方法があります。

## 同じファイル内で処理を分ける
下記ファイルのように、 `if: github.event_name == 'merge_group'`を設定し、特定のイベントの時のみ実行するように設定します。

```yaml
name: ci

on: 
  pull_request:
  merge_group:

jobs:
  CI:
    name: CI
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      - name: Run on pull_request and merge_group
        run: echo "This step runs on pull_request and merge_group events."
      - name: Run only on merge_group
        if: github.event_name == 'merge_group'
        run: echo "This step runs only on merge_group events."
```

## 別ファイルで管理する
ポイントはjobの名前を共通にしておくことです。
同じ名前にしておかないと、実行されませんのでご注意ください。

```yaml:.github/workflows/ci.yaml
name: flutter_ci

on: pull_request

jobs:
  CI:
    name: CI
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      - name: Run on pull_request
        run: echo "This step runs on pull_request events."
```

```yaml:.github/workflows/marge.yaml
name: merge
on:
  merge_group:

jobs:
 CI:
    name: CI
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      - name: Run on merge_group
        run: echo "This step runs on merge_group events."
```