2020/03/15

Github Actions の branches-ignore と branches は push/pull_request の両方には書けない

Github Actions ではワークフローごとに実行する(トリガーする)タイミングをいろいろ細かく指定できる。

公式ドキュメントにあるとおりだが、

# プッシュでトリガー
on: push

リストで指定もできる。

# プッシュあるいはプルリクエストで実行
on: [push, pull_request]

ブランチを明示していく場合は以下のようになる。

on:
  # プッシュもしくはプルリクエストでワークフローを実行し、
  # ブランチは master のみ
  push:
    branches:
      - master
  pull_request:
    branches:
      - master

branch と tag にはそれぞれ branches と branches-ignore、または tags と tags-ignore というリストする対象を肯定、または否定する構文(フィルタ)がある。

この、肯定または否定する構文(フィルタ)は push / pull_request において、実はどちらかしか書けない。以下のように書いても意図したようには走り分けてもらえない。

on:
  # masterブランチか、fooではないブランチでpull_requestされたとき実行
  push:
    branches:
      - master
  pull_request:
    branches-ignore:
      - foo

正しくはこうなる。branches の中に否定を示す '!' を使ってリストする。

on:
  push:
    branches:
      - master
  pull_request:
    branches:
      - '!foo'

つまり、branches-ignore と branches (tags-ignoreとtags)を push / pull_request にまたがって両方書くことはできない。

これは公式ドキュメントでも以下のように書かれている。

branches または branches-ignore - ワークフロー内の同じイベントに対して、branches と branches-ignore のフィルタを両方使うことはできません。 肯定のマッチに対してブランチをフィルタし、ブランチを除外する必要がある場合は、branches フィルタを使います。 ブランチ名のみを除外する必要がある場合は、branches-ignore フィルタを使います。

ちょっとわかりづらい。

端的に branches-ignore と branches は両方書けない。否定は '!' を使え、ということ。

サイト内検索