CircleCIの2.0で導入されたWorkflowsを使うことで、複数のジョブを実行できる。
ちなみにCircleCIのCLIツールでは、Workflowsは使えない模様。
バージョン0.1.5607+f705856のCLIツールを使ってローカルで実行しようとしたところ、ダメだった。
Workflowsを使うには、.circleci/config.ymlにworkflowsセクションを追加し、CircleCIのバージョンのあとにworkflowの名前を書いていく。
そのwordflowで実行するジョブをjobsに書いていく。
以下のbuild_and_testは、my_buildとmy_testを実行する。
version: 2 jobs: my_build: docker: - image: circleci/node:10.9.0 steps: - run: echo "ビルドしたよ" my_test: docker: - image: circleci/node:10.9.0 steps: - run: echo "テストしたよ" workflows: version: 2 build_and_test: jobs: - my_build - my_test
上記の記述だと、my_buildとmy_testをパラレルに実行する。
これを、シーケンシャルに実行する形に書き換える。今回はmy_buildの次にmy_testを実行することにする。
ジョブにrequiresを指定すると、指定されたジョブが処理されるまで実行を待つ。
以下の例だと、my_buildの処理が完了するまで、my_testは実行されない。
version: 2 jobs: my_build: docker: - image: circleci/node:10.9.0 steps: - run: echo "ビルドしたよ" my_test: docker: - image: circleci/node:10.9.0 steps: - run: echo "テストしたよ" workflows: version: 2 build_and_test: jobs: - my_build - my_test: requires: - my_build
my_buildをわざと失敗させて、確認してみる。
& exit 1をつけて、my_buildが失敗するようにした。
version: 2 jobs: my_build: docker: - image: circleci/node:10.9.0 steps: - run: echo "ビルドしたよ" & exit 1 my_test: docker: - image: circleci/node:10.9.0 steps: - run: echo "テストしたよ" workflows: version: 2 build_and_test: jobs: - my_build - my_test: requires: - my_build
意図通り、my_testは実行されなかった。
そして、requiresの指定を外してパラレルに戻すと、my_testはmy_buildの実行や失敗には影響されずに処理された。
最後に、ブランチによって処理を変える方法について記述する。
filters:branches:only:ブランチ名で、そのブランチでのみ、そのジョブを実行する。
以下は、developmentブランチでのみ、my_buildを処理したあとにmy_testを実行する場合の記述。
version: 2 jobs: my_build: docker: - image: circleci/node:10.9.0 steps: - run: echo "ビルドしたよ" my_test: docker: - image: circleci/node:10.9.0 steps: - run: echo "テストしたよ" workflows: version: 2 build_and_test: jobs: - my_build - my_test: filters: branches: only: development requires: - my_build