Workflows【CircleCI】
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