🐙

「approve me」とコメントすると Approve してくれる GitHub Actions ワークフロー

2022/07/19に公開
2

イメージとしてはこんな感じ。

用途としては、ブランチ保護の設定で、1人以上の Approve をマージボタン活性化の条件にしてあるが、緊急でマージしたい場合や、軽微なので自己判断でマージしたい、という場合。

これを実現するワークフローは次のようになる。編集にも対応しているので、ちょっと if 文が複雑になっているが、やっていることはそんなに難しくないはず。

name: Approve Me

on:
  issue_comment:
    types: [created, edited]

jobs:
  approve:
    name: Approve
    if: |
      github.event.issue.state == 'open' &&
      github.event.issue.pull_request != null &&
      contains(github.event.comment.body, '@github-actions approve me') &&
      (github.event.action != 'edited' || (github.event.action == 'edited' && !contains(github.event.changes.body.from, '@github-actions approve me')))
    runs-on: ubuntu-latest
    steps:
      - name: Approve pull request
        env:
          GH_REPO: ${{ github.repository }}
          GH_TOKEN: ${{ github.token }}
        run: gh pr review ${{ github.event.issue.number }} --approve

プルリクのコメントだけに反応させ、Issue でのコメントには反応させないように github.event.issue.pull_request != null を指定している。もしコードをチェックアウトしてあればカレントのリポジトリがそれにより判断されるので環境変数 GH_REPO は不要だが、このワークフローの場合はチェックアウトしてないので指定が必要となっている。

ブランチ保護の意味ないじゃん!と思うかもしれないが、信頼できるチームメンバーのみ参画するプロジェクトでは問題ないと思うし、いちおうコメントすることは必要なのでこっそりと Approve させることは出来ないのでよいかなと思う。コメントにチームメンバーへの申し送り的な文言を含める運用でもよさそう。

それでも気になるなら、何かしらのジョブの実行条件を追加して、より限定的にすることを検討されたし。例えばプルリクの base ブランチを取得して、開発系のブランチへのマージだけで許可するとか、特定のユーザによるコメントのみ許可するとか。

今回は Approve だが、これを応用すると色々なことを実行させることが出来そう。

Discussion

ykwsykws

以下が必要でした。

  • Allow GitHub Actions to create and approve pull requests のチェックする

  • permissions: pull-requests: writeruns-on の後に追加する