「WIP Action」を用いて GitHub で誤マージを防ぐ

## 概要

GitHub の PR で下記のような経験をしたことはありませんか？

- リリースに向けて指定された日時にマージしないといけない PR を誤ってマージしてしまった
- 試験的に作成した PR でマージしてはいけないものをマージしてしまった

自分も上記のようなことをして、ヒヤリとしたことが度々ありました。

そんなときに役立つのが「WIP Action」という GitHub Action です。

- [Marketplace](https://github.com/marketplace/actions/wip-action)
- [GitHub](https://github.com/wip/action)

これを有効化すると、誤マージを防ぐことに役立ちます。
下記のいずれかのキーワードを PR のタイトル・ラベルに設定すると、マージをできないように保留状態にしてくれるのです。

- wip
- rfc
- work in progress
- work-in-progress
- do not merge
- do-not-merge
- 🚧

この記事では WIP Action を有効にする方法をお伝えします。

## WIP Actions 有効化の方法

WIP Actions を有効化するためには、下記2つの作業が必要です。

1. WIP Actions の GitHub Actions ワークフローを作成する
1. WIP Actions を実行できるようにリポジトリの設定を変更する

順に見ていきます。

### リポジトリに GitHub Actions ワークフローを作成する

はじめて GitHub Actions ワークフローを作成する場合は、ディレクトリを作成します。

```shell
mkdir -p ./.github/workflows
```

作成した `workflows` ディレクトリ内に、下記のような YAML ファイルを用意します。

```wip_action.yml
name: WIP
on:
  pull_request:
    types: [opened, synchronize, reopened, edited]

jobs:
  wip:
    runs-on: ubuntu-latest
    steps:
      - uses: wip/action@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
```

実行トリガーについて少し補足しておくと、`types: [opened, synchronize, reopened, edited]` は

- `opened`: Pull Request が作られたとき（Draftを含む）
- `synchronize`: Pull Request にコミットが追加されたとき
- `reopened`: Pull Request が Close された状態から再度 Open になったとき
- `edited`: Pull Request のタイトル・本文・ベースブランチが変更されたとき（Draftを含む）

を示します[^1]。

### リポジトリの設定を変更する

前述のファイルを作成することで WIP Action を動かすことはできます。
しかし、期待通りの動きはせず、マージできる状態が続きます。
リポジトリの設定により、コミットステータスの書き込み権限がないためです。

まずは、WIP Action を適用したいリポジトリを開き、「Settings」を選択します。

![Settings](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281085/5749f086-b957-e861-b94e-3277c7bd876f.png)

サイドメニューで「Actions」をクリックして詳細メニューを開いた上で、「General」を選択します。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281085/8ce23be7-0f7b-7455-0aff-7e0e0416e9cf.png">

「Workflow permissions」の選択肢を `Read repository contents and packages permissions` から `Read and write permissions` に変更しましょう。

![スクリーンショット 2024-06-12 13.13.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281085/6225b843-24e1-85f6-57a2-26316e19138d.png)

Actions メニューの設定変更は以上です。

---

次に、サイドメニューから「Branches」を選択してブランチの設定に移ります。
WIP Action のステータスがグリーンでない場合にマージを防ぎます。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281085/725eb2d8-63e4-dfb5-9773-bb0f42a7cce6.png">

「Add rule」ボタンを押して適用するルールを作成します。

![Add rule](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281085/56b19eb4-a6eb-a030-fa64-07748e513fa5.png)

適用するブランチ名を記載して、「Require status checks to pass before merging」にチェックを入れます。
その後出てくる検索窓で「WIP (action)」を選択しましょう[^2]。

![Branch name pattern
](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281085/8eab358d-daf7-8776-5ed7-c0726b041bdc.png)

![Require status checks to pass before merging](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281085/31fe022a-6a3a-eaf5-061e-bba3a1606537.png)

これで WIP Action で注意喚起できます。

![Merge without waiting for requirements to be met (bypass branch protections)](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281085/0757520e-ebe2-5343-f3c8-db8e035f037f.png)

メッセージやボタンの表示が普段と異なるのがわかるかと思います。

:::note warn
プライベートリポジトリの場合、WIP Action によるブランチの保護は GitHub Team や GitHub Enterprise のアカウントでしか使えないのでご注意ください。
:::

## まとめ：WIP Action を活用して誤マージを防ごう

この記事では、PR にキーワードを付けることで誤マージの注意喚起ができる WIP Action を有効にする方法をお伝えしました。
人間気をつけようと思っていても間違えてしまうことはよくあります。
WIP Action が間違いを防ぐ仕組みの一助になれば幸いです。

:::note
本記事はQmonus Value Streamの投稿キャンペーン記事です。
:::

[^1]: [GitHub Actionsにおけるpull_requestイベントのアクティビティの種類 - Qiita](https://qiita.com/Soh1121/items/b2bc51afc933c910806c)
[^2]: 検索窓が出てこない場合は実際に WIP Action が動くように PR を立ててみましょう。