workflowsを用いると、jobsの実行順を制御することができます。また、workflows内のjobの実行が失敗すれば直ちに通知されるため、無駄に待つ必要がありません。
versionとworkflow名を指定し、workflow内に、jobs内に指定したjob名を連ねます。
version: 2
jobs:
build:
docker:
- image: circleci/<language>:<version TAG>
steps:
- checkout
- run: <command>
test:
docker:
- image: circleci/<language>:<version TAG>
steps:
- checkout
- run: <command>
workflows:
version: 2
build_and_test:
jobs:
- build
- test
実行タイミングの制御
workflowのjobsに記載されたjobは、デフォルトでは同時並行に処理されます。順序を制御したい場合にはrequiresを使います。
workflows:
version: 2
build_and_test:
jobs:
- build
- test:
requires:
- build
また、type:approvalを用いることで、CircleCIのJobページにて手動で承認をするまで、処理を停止させることもできます。
workflows:
version: 2
build_and_test:
jobs:
- build
- test:
requires:
- build
#holdは、画面上での承認処理を必要とする
- hold:
type: approval
requires:
- test
- deploy:
requires:
- hold
画面での操作方法など詳細はUsing Workflows to Schedule Jobs - CircleCIを参照ください。
triggersを使えば、スケジューリングすることも可能です。
workflows:
version: 2
nightly:
triggers:
- schedule:
cron: "0 0 * * *"
filters:
branches:
only:
- master
- beta
jobs:
- test
2019年1月現在の仕様では、triggersにはscheduleの使用が指定されています。scheduleを使用すると、cronとfiltersを指定する必要があります。
cronの書き方はcrontabの書き方 | server-memo.netを参照ください。filtersを使って、scheduleによる実行を適用するbranchを指定します。branchはonly(必須)とignore(任意)を使って指定します。
- onlyに記載されたbranch全てが実行の対象です
- ignoreに記載されたbranchでは実行されません
- only、ignoreどちらも指定がない場合は、全てのbranchが対象になります
- only、ignoreどちらにも記載されたbranchは実行の対象になります
onlyは指定必須なので、公式の原文「If neither only nor ignore are specified then all branches will run the job.」と一見矛盾するようですが、「/」で囲むと正規表現が使えるので、「onlyを特定しない」状況を作り出すことができます。
下記サンプルは、毎時33分に全てのbranchを対象として、build_and_testを実行する例です。onlyにて正規表現を使用しています。
workflows:
version: 2
build_and_test:
triggers:
- schedule:
cron: "33 * * * *"
filters:
branches:
only:
- /.*/
jobs:
- build
- test:
requires:
- build
詳細な設定はConfiguring CircleCI - CircleCIを参照ください。
workflowの実行パターン
直列実行と、並行を実現するFan-in Fan-outを紹介します。
直列実行:
Using Workflows to Schedule Jobs - CircleCIより引用
requiresキーで直前に完了しているべきjobを指定します。
workflows:
version: 2
build-test-and-deploy:
jobs:
- build
- test1:
requires:
- build
- test2:
requires:
- test1
- deploy:
requires:
- test2
Fan-in Fan-out:
Using Workflows to Schedule Jobs - CircleCIより引用
Fan部分(並行させたいjobs)では、requiresキーにFan-inを指定し、Fan-outでは、Fan部分全てのjobをrequiresに指定します。
workflows:
version: 2
build_accept_deploy:
jobs:
- build
- acceptance_test_1:
requires:
- build
- acceptance_test_2:
requires:
- build
- acceptance_test_3:
requires:
- build
- acceptance_test_4:
requires:
- build
- deploy:
requires:
- acceptance_test_1
- acceptance_test_2
- acceptance_test_3
- acceptance_test_4
対象の絞り込み
先述のscheduleでもfiltersは登場しましたが、schedule実行ではなく単に対象を絞り込む時にもfiltersが使えます。branchまたはtagを指定して対象を絞ることが可能です。
workflows:
version: 2
build-n-deploy:
jobs:
- build:
filters:
tags:
only: /.*/
- deploy:
requires:
- build
filters:
tags:
only: /^v.*/
branches:
ignore: /.*/
詳細な設定方法は、Configuring CircleCI - CircleCIを参照ください。
また、正規表現の使い方としてJava Platform SE 6が案内されています。
データの受け渡し
workflow内でのデータの受け渡しには、workspaceが適しています。workspaceはworkflowの実行完了と共に削除される一時的な保存スペースです。
version: 2.1
executors:
my-executor:
docker:
- image: buildpack-deps:jessie
working_directory: /tmp
jobs:
flow:
executor: my-executor
steps:
- run: mkdir -p workspace
- run: echo "Hello, world!" > workspace/echo-output
# Persist the specified paths (workspace/echo-output) into the workspace for use in downstream job.
- persist_to_workspace:
# rootでworkspaceとして扱うディレクトリ(絶対パスまたはworking_directoryからの相対パス)を指定
# pathで保存する対象のファイルまたはディレクトリ(GoのGlobを使用)をrootからの相対パスで指定
root: workspace
paths:
- echo-output
downstream:
executor: my-executor
steps:
- attach_workspace:
# 絶対パスかworking_directoryからの相対パスを指定する必要がある
at: /tmp/workspace
- run: |
if [[ `cat /tmp/workspace/echo-output` == "Hello, world!" ]]; then
echo "It worked!";
else
echo "Nope!"; exit 1
fi
workflows:
version: 2.1
btd:
jobs:
- flow
- downstream:
requires:
- flow
失敗したworkflowのjob再実行
失敗したjobを画面上から再実行するだけです。FAILEDと表示されている対象のjobからworkflowをクリックし、「Rerun」をクリック、「Rerun from failed」を選択します。
Using Workflows to Schedule Jobs - CircleCI
Configuring CircleCI - CircleCI