30歳からのプログラミング

30歳無職から独学でプログラミングを開始した人間の記録。

CircleCI の Workflows を使う

CircleCI2.0で導入されたWorkflowsを使うことで、複数のジョブを実行できる。

ちなみにCircleCIのCLIツールでは、Workflowsは使えない模様。
バージョン0.1.5607+f705856のCLIツールを使ってローカルで実行しようとしたところ、ダメだった。

Workflowsを使うには、.circleci/config.ymlworkflowsセクションを追加し、CircleCIのバージョンのあとにworkflowの名前を書いていく。
そのwordflowで実行するジョブをjobsに書いていく。

以下のbuild_and_testは、my_buildmy_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_buildmy_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_testmy_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

参考資料