ジョブでは環境とその中で行う処理フローを定義してきましたが、ワークフローはそのジョブをいつ・どんな時に実行するかの制御を行います。例えばそれは
いつ
毎週土曜の0時に
1時間おきに
どんな時に
master
ブランチにコミットがプッシュされた時v0.1.0
がプッシュされた時前のワークフローが終わった時
権限を持つ者が承認した時
のような場合です。
その前にまずデフォルトの動作の話。以下のような設定の時、ワークフローa
とb
は、「いつ」と「どんな時に」どちらも設定していませんが、何かしらコミットがプッシュされた時にどちらも実行されます。
jobs:
echo:
docker:
- image: alpine
steps:
- run: echo foo
workflows:
a:
jobs:
- echo
b:
jobs:
- echo
またjobs
に複数のジョブを渡した場合、それぞれのjob
は個別に順不同に実行されます。つまり以下の場合b
の方が先に実行される可能性があります。
workflows:
a:
jobs:
- a
- b
いつ
「いつ」を設定するにはtriggers
が必要です。もしa
を「毎週土曜の0時に」だけ実行されるようにしたい場合以下のように設定します。
workflows:
a:
triggers:
- schedule:
cron: "0 0 * * 6"
jobs:
- echo
「一時間おきに」も追加したいなら、schedule.cron: "0 0-23 * * *"
も追加してあげます。
これでも良いですが、これはその時存在するすべてのブランチでその時になったら実行されます。もしブランチやタグを指定したい場合はcron
と同じ階層にfilters
を置くことができます。
例えばmaster
とdevelop
ブランチだけであれば、
cron: ...
filters:
branches:
only:
- master
- develop
のようにします。またonly
には正規表現も渡すことができ、マッチしたブランチだけというようなこともできます。
cron: ...
filters:
branches:
only: /cron.*/
only
とは逆の意味のignore
というキーを変わりに置くこともできます。
cron: ...
filters:
branches:
ignore: /master|develop/
タグの場合はtags
をbranches
と同じ階層に置きます。タグの場合デフォルトではすべて対象となっていないため、すべてのタグも実行対象にしたい場合(多分ない)、
cron: ...
filters:
tags:
only: /.*/
のようにします。
どんな時に
上記のfilters
でほぼ「どんな時に」の話なのですがこれはトリガー内での話なので、それ単体で設定したい場合はどうすればいいか。それはジョブ毎に設定してあげます。各ジョブにおいてもfilters
を持つことができ、これは上記のものと同じような設定を置けます。
workflows:
a:
jobs:
- echo:
filters: ...
「前のワークフローが終わった時」に関してはrequires
という設定を持てます。これは配列で中には他のジョブ名が入ります。例えば値が["foo"]
の時その意味は「foo
ジョブが終わったらコレを実行しろ」という感じになります。
以下の例のように1つ前のジョブをrequires
で指定することでジョブを狙った通りの順番で実行することができ、最初のジョブに対してフィルターをかけることで対象の指定もできることになります。
workflows:
workflow:
jobs:
- pre:
filters:
branches: /master/
- main:
requires:
- pre
- suf:
required:
- main
他にtype: approval
を各ジョブは持て、これを指定するとワークフローのそのジョブは待機状態で止まります。そのジョブを実行するには権限ある者がワークフローページで「Approve」する必要があります。