🚟
特定のブランチ名のプルリクエストで動作するGitHub Actionsを作る
特定のブランチ名のプルリクエストの場合にの実行される GitHub Actions のジョブを作ろうとしたときに詰まったのでメモ。
よくある間違い
最初によくある間違いというか、自分が最初書いていて「なぜか実行されん🤔」と詰まった書き方です。
以下は dependabot の作ったプルリクエストの場合のみ実行される GitHub Actions のジョブを作ろうとした場合の例です。
name: Sample actions
on:
pull_request:
branches:
- 'dependabot/**'
jobs:
sample-job:
runs-on: ubuntu-18.04
steps:
- name: Greeting
run: echo 'Hello world'
on.pull_request.branches
でブランチ名を指定しています。ですが、これでは動作しません。
というのも、ここのon.pull_request.branches
で評価されるブランチ名はプルリクエストのマージ対象ブランチ名(ex: main, master, develop)だからです。
Job単位で制御
Job 単位でブランチ名による制御を行う場合の書き方はこちらです。
name: Sample actions
on:
pull_request:
branches:
- 'dependabot/**'
jobs:
sample-job:
runs-on: ubuntu-18.04
if: contains(github.head_ref, 'dependabot')
steps:
- name: Greeting
run: echo 'Hello world'
jobs.*.if
で条件式を追加することで、特定のブランチ名の場合のみ実行する Job が作れます。
ここでは、contains
式でgithub.head_ref
から取得出来るブランチ名を判定することで制御しています。
Step単位で制御
Step 単位でブランチ名による制御を行う場合の書き方はこちらです。
name: Sample actions
on:
pull_request:
branches:
- 'dependabot/**'
jobs:
sample-job:
runs-on: ubuntu-18.04
steps:
- name: Greeting
- if: contains(github.head_ref, 'dependabot')
run: echo 'Hello world' # ここだけ上の条件式が真の場合のみ実行される
- name: Greeting
run: echo 'Good by world'
jobs.*.steps.if
で条件式を追加することで、特定のブランチ名の場合のみ実行する Step が作れます。
Discussion
Job単位で制御
とStep単位で制御
の例でもon.pull_request.branches
を指定してますが、jobs.*.if
やjobs.*.steps.if
を指定していれば問題なく実行されるのでしょうか?余談ですが、冒頭の書き方のように pull request作成元(head)のブランチを条件として、prが開かれたとき発火するワークフローは以下のように定義できます。検索で流れてくる人もいそうなのでコメント残しておきます。