🛠️

レビューの準備ができたときにのみGithubActionsを実行する

2022/12/18に公開

普段のGtihubActionsの設定と問題

設定

GtihubActionsのワークフローのイベントを「特定のブランチにPull Requestされたら実行する」という設定にしていました。

on:
  pull_request:
    branches:
      - main
      - 'feature/**'
jobs:
    ︙
    実行したい処理
    ︙

問題

ただ、この状態ではPull Requestをオープンすると、以下のときにワークフローが実行されます。

type 説明
opened Pull Requestが作成されたとき
synchronize Pull Requestにコミットがpushされたとき
reopened クローズしたPull Requestを再オープンしたとき

この状態ではPull Requestを作ったときコミットがpushされるたびにGtihubActionsが実行されてしまいます。

レビューの準備ができたときにのみ実行する

そこでPull Requestの状態に応じて、実行タイミングを以下のように指定したワークフローを設けたいと思いました。

  • Pull RequestをDraftからレビュー準備完了の状態に変えたときは実行する
  • Pull RequestをDraftで作成したときは実行しない

改善案

Pull RequestをDraftからレビュー準備完了の状態に変えたときは実行する

pull_request イベントに対してアクティビティを ready_for_review に指定することで、「Draftからレビュー準備完了の状態に変えた」ときに実行するように設定ができます。

on:
  pull_request:
    types:
      - ready_for_review # draftからPRレビューに変わったとき
    branches:
      - main
      - 'feature/**'
jobs:
    ︙
    実行したい処理
    ︙

Pull RequestをDraftで作成したときは実行しない

上記だけでは、Pull Requestを作成したときにワークフローが実行されてしまうので、 jobs のほうに「Draftで作成したときは実行しない」条件をつけます。
例えば、 build というジョブに対して条件をつけるときは以下のようになります。

on:
  pull_request:
    types:
      - ready_for_review # draftからPRレビューに変わったとき
    branches:
      - main
      - 'feature/**'
jobs:
    build:
      if: github.event.pull_request.draft == false
      ︙
      実行したい処理
      ︙

githubコンテキストからは実行したワークフローに関する情報が使えます。

今回は github.event.pull_request.draft から「ワークフローを実行しているPull Requestの状態がDraftなのかどうか」の情報を取得して判定します。

ワークフローを実行している段階でPull RequestがDraftの場合は実行させたくない(Draftではないときは実行したい)ので、 github.event.pull_request.draftfalse のときという条件をつけます。

これでPull RequestをDraftからレビューの準備ができたときにのみGtihubActionsのワークフローを実行することができます。

締め

これでGtihubActionsのワークフローをレビューの準備ができたときにのみ実行する設定ができました。

設定自体はこれでOKですが、運用時は以下のケースを考えてそれぞれの対応方法を決めるといいと思いました。

  • チームメンバーへレビュー依頼するとき
  • レビューで指摘を受け、修正をするとき

参考

https://frontside.com/blog/2020-05-26-github-actions-pull_request/

https://zenn.dev/snowcait/scraps/9d9c47dc4d0414

https://docs.github.com/ja/actions/using-jobs/using-conditions-to-control-job-execution

https://docs.github.com/ja/actions/learn-github-actions/contexts#github-context

Discussion