🚟

特定のブランチ名のプルリクエストで動作するGitHub Actionsを作る

2021/04/20に公開2

特定のブランチ名のプルリクエストの場合にの実行される 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

mizukmbmizukmb

Job単位で制御Step単位で制御 の例でも on.pull_request.branches を指定してますが、 jobs.*.ifjobs.*.steps.if を指定していれば問題なく実行されるのでしょうか?

2357gi2357gi

余談ですが、冒頭の書き方のように pull request作成元(head)のブランチを条件として、prが開かれたとき発火するワークフローは以下のように定義できます。検索で流れてくる人もいそうなのでコメント残しておきます。

on:
  pull_request:
    types:
      - opened
jobs:
  run_if:
    if:  startsWith(github.head_ref, 'releases/')
    runs-on: ubuntu-latest
    steps:
      - run: echo "The head of this PR starts with 'releases/'"

https://docs.github.com/ja/actions/using-workflows/events-that-trigger-workflows#pull_request