🎉

特定ラベルのついた Pull Request の誤マージを防ぐ GitHub Actions をつくる

2024/11/29に公開

先日、Pull Request が誤マージされてしまう事案がおきたので、防止策として特定の人の Approve がないとマージできないようにする GitHub Actions を作った。

設定する制約

あらかじめ 1 人以上の Approve が必要となる Branch Protection Rule を設定しているが、以下の制約を GitHub Action で追加し、Pull Request の誤マージの実行を阻止することとする。

  1. 特定のラベルが設定されている Pull Request のみにルールを適用する
  2. 特定の人物(ただし、コードオーナーではない)の 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 に動作検証担当メンバーを設定しておく必要がある。

https://zenn.dev/watahaya/articles/03828139d62601

https://github.com/hayawata3626/team-approval-checker

リポジトリの 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 に書いてある例とほぼ同じだった。

まとめ

あしたのチーム Tech Blog

Discussion