特定ラベルのついた Pull Request の誤マージを防ぐ GitHub Actions をつくる
先日、Pull Request が誤マージされてしまう事案がおきたので、防止策として特定の人の Approve がないとマージできないようにする GitHub Actions を作った。
設定する制約
あらかじめ 1 人以上の Approve が必要となる Branch Protection Rule を設定しているが、以下の制約を GitHub Action で追加し、Pull Request の誤マージの実行を阻止することとする。
- 特定のラベルが設定されている Pull Request のみにルールを適用する
- 特定の人物(ただし、コードオーナーではない)の Approve があればマージ可能とする
まず、1 について。同じ primary branch にマージする Pull Request でも、 feature の追加や不具合の修正の Pull Request と、GitHub Actions を追加するような Pull Request では扱いが異なる。
そのため、特定のラベルがついたもののみを阻止対象とする。ここでは、release ラベルがついたものを阻止対象とする。
そして 2 について。primary branch にマージする前に実際に環境に反映して動作確認をしてからマージする運用になっているため、動作検証担当メンバーが Approve するまではマージできないようにする。
これについては、hayawata3626/team-approval-checker を使って実現する。
hayawata3626/team-approval-checker
hayawata3626/team-approval-checker は、リポジトリに設定している team のメンバーの Approve があるかどうかをチェックしてくれる action で、指定した値に満たない場合は失敗する。
そのため、あらかじめ team に動作検証担当メンバーを設定しておく必要がある。
リポジトリの team 情報を取得するため、GitHub Actions にデフォルトで備わっている GITHUB_TOKEN では権限が足りない。別途権限を補う必要がある。
GitHub Actions の YAML を書く
以下のような YAML を作成した。
actions/create-github-app-token を利用しているのは、hayawata3626/team-approval-checker でリポジトリの情報を取得する必要があるためである。
ここでは独自に作成した GitHub App のトークンを使って、リポジトリにアクセスできるトークンを生成している。GitHub Apps の作成についてはここでは割愛する。
name: check approval existence
on:
pull_request_review:
types:
- submitted
jobs:
check_approval_existence:
if: >-
${{
contains(github.event.pull_request.labels.*.name, 'release')
}}
runs-on: ubuntu-latest
timeout-minutes: 1
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Generate a github token
id: generate_token
uses: actions/create-github-app-token@v1
with:
app-id: ${{ secrets.APP_ID }}
private-key: ${{ secrets.PRIVATE_KEY }}
owner: ${{ github.repository_owner }}
repositories: "<your repository name>"
- name: Find specific member approval
uses: hayawata3626/team-approval-checker@v1.2.0
with:
conditions:
'[{"team": "qa", "minimumCount": 1}]'
github-token: ${{ steps.generate_token.outputs.token }}
後々よくみたら、hayawata3626/team-approval-checker の README に書いてある例とほぼ同じだった。
まとめ
- GitHub Action を使って、誤マージを防ぐ対策を施した
- hayawata3626/team-approval-checker 便利
Discussion