CircleCI の workflows の branch フィルタは ignore と only を同時に指定できない
2018/09/11 時点での情報です。以降は仕様が変更される可能性があるのでご注意ください。
CircleCI の config.yml の workflows には branches という、完全一致か正規表現にマッチした branch のみを対象にするフィルタがあります。
このとき、ignore = マッチしたものを除外 と only = マッチしたもののみ、を対象とするオプションを指定できますが、両方を同時に使用することはできません。
If both ignore and only are present in config, only ignore will be taken into account.
ref: https://circleci.com/docs/2.0/configuration-reference/#branches
と書いてあるのですが、実際の挙動は only だけが適用されているように見えます。
以下のような設定で、foobar のときは foobar、foobar 以外の foo から始まる branch は foobaz という job、という workflow にしたつもりでも、実際は foobaz と foobar 両方の job が実行されます。
workflows:
version: 2
deploy:
jobs:
- foobaz:
filters:
branches:
only: /foo.+/
ignore:
- foobar
- foobar:
filters:
branches:
only: foobar
もし、ignore と only を同時に使いたい場合、たとえば only で正規表現の否定先読みを使って ignore に書いていた設定を only で行うようにする、という方法があります。 ちなみに、CircleCI の正規表現は Java で使える構文が使える、とドキュメントに書いてあります。
CircleCI branch and tag filters support the Java variant of regex pattern matching. When writing filters, CircleCI matches exact regular expressions.
ref: https://circleci.com/docs/2.0/workflows/#using-regular-expressions-to-filter-tags-and-branches
以下が前述の設定を書き直す例です。
workflows:
version: 2
deploy:
jobs:
- foobaz:
filters:
branches:
only: /foo(?!bar).+/
- foobar:
filters:
branches:
only: foobar