GitHub Actionsでレビュー可能になった時に任意のジョブを実行する
やりたいこと
GitHub 上でプルリクエストを作成した際に、
大体の現場では、GitHub Actions で CI/CD を実行するワークフローを作っているかなと思います。
既存の CI/CD は今まで通りに実行するとして、
プルリクを作ったり、ドラフトから公開にしたりで、レビューして欲しいとなったタイミングだけ、
Slack やらで通知を送ったりしたいと思ったので検知する方法を調べました。
(書きつくされた話題な感じはありますが、久々にやったら結構詰まったので...)
前提
プルリクが作成された時に CI/CD を実行したいとなった時、
ブランチの指定が無ければ、以下のような記載になると思います。
on: pull_request
# 諸々省略しますがCI/CDをやるとして...
jobs:
build:
トリガーに pull_request だけ指定すると、
opened
, reopened
, synchronize
のアクティビティが発生した時にトリガーされます。
今回はここに条件を追加して既存の処理はそのままに、
いわゆるレビュー可能になったら何かしらの処理を実行できるようにしたいと思います。
(具体的な 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.action
とgithub.event.pull_request.draft
を元に分岐処理を設定しました。
github.event.action
で文字列でアクティビティ名が取得でき、
github.event.pull_request.draft
でドラフトか否かを boolean で取得できます。
(github.event.pull_request
オブジェクト内にアクティビティ名があるかと思い込んで、
github.event.action
に気づくのに時間がかかった)
これで Slack などのチャットツールに通知を送ったりができそうです。
Discussion