技術向上

プログラミングの学び、気になるテクノロジーやビジネストレンドを発信

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を紹介します。

直列実行:

https://circleci.com/docs/assets/img/docs/sequential_workflow.png 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:

https://circleci.com/docs/assets/img/docs/fan_in_out.png 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

crontabの書き方 | server-memo.net

Java Platform SE 6