👻

GitHub Actionsでレビュー可能になった時に任意のジョブを実行する

2024/08/02に公開

やりたいこと

GitHub 上でプルリクエストを作成した際に、
大体の現場では、GitHub Actions で CI/CD を実行するワークフローを作っているかなと思います。

既存の CI/CD は今まで通りに実行するとして、
プルリクを作ったり、ドラフトから公開にしたりで、レビューして欲しいとなったタイミングだけ、
Slack やらで通知を送ったりしたいと思ったので検知する方法を調べました。
(書きつくされた話題な感じはありますが、久々にやったら結構詰まったので...)

前提

プルリクが作成された時に CI/CD を実行したいとなった時、
ブランチの指定が無ければ、以下のような記載になると思います。

on: pull_request

# 諸々省略しますがCI/CDをやるとして...
jobs:
    build:

トリガーに pull_request だけ指定すると、
opened, reopened, synchronize のアクティビティが発生した時にトリガーされます。

https://docs.github.com/ja/actions/writing-workflows/choosing-when-your-workflow-runs/events-that-trigger-workflows#pull_request

今回はここに条件を追加して既存の処理はそのままに、
いわゆるレビュー可能になったら何かしらの処理を実行できるようにしたいと思います。
(具体的な Slack 通知のやり方は記載していません)

「レビュー可能」な状態は以下の条件で判定することにしました。

  • プルリクが作成(opened)された。
    • かつプルリクが Draft ではない。
  • プルリクが Draft から、Ready for review に変更された。

プルリクが作成されると opened のイベントが検知されますが、
ドラフトで作った場合もイベント自体はopenedになっています。
先にドラフトで作ったけど、
手を入れてから見せたい場合に、通知が行くとウザいので条件に入れています。
また、Draft かどうかはイベントではなくステータス?なので、
別途イベントを検知してトリガーされるようにします。

トリガー変更と条件式追加

というわけでこんな感じで変更しました。

on:
    pull_request:
        types: [opened, reopened, synchronize, ready_for_review]

jobs:
    send-notification:
        runs-on: ubuntu-latest
        steps:
            name: send notification
            if:
                (github.event.action == 'opened' && !github.event.pull_request.draft)
                || github.event.action == 'ready_for_review'
            run: echo can send notification

トリガーとしてドラフトから Ready for review に変更した時も検知したいため、
types の配列の 4 つ目にready_for_reviewを追加しました。
他の 3 つは明示的に指定して、単にon: pull_requestと記載した時と同じ動きにしています。

トリガーは設定できたので、実行したいジョブの条件として、
github.event.actiongithub.event.pull_request.draftを元に分岐処理を設定しました。

github.event.actionで文字列でアクティビティ名が取得でき、
github.event.pull_request.draftでドラフトか否かを boolean で取得できます。
(github.event.pull_requestオブジェクト内にアクティビティ名があるかと思い込んで、
github.event.actionに気づくのに時間がかかった)

これで Slack などのチャットツールに通知を送ったりができそうです。

GitHubで編集を提案

Discussion