前回の記事に続き,CircleCI 2.0 の調査をしている.今回は CircleCI から公式に提供されている「ワークフローデモ用リポジトリ」を活用して,CircleCI 2.0 の新機能である「ワークフロー機能」の仕組みと,設定ファイルのポイントを学んだ.「ワークフローデモ用リポジトリ」では,以下の4種類(+1種類)のデモがある.
- Parallel Jobs
- Sequential Job / Branch-Level
- Fan-in / Fan-out
- Workspace Forwarding
- Schedule
Parallel Jobs
CircleCI 2.0 の「ワークフロー機能」では,複数のジョブを並列に実行することができる(デフォルトで並列に実行される).デモでは,3種類の異なる Ruby バージョンで並列にテストを実行しているため,CI の実行時間を短縮することができる.CI の実行時間が伸びるとツライため,並列に実行できるのは素晴らしい!
workflows: version: 2 build: jobs: - "ruby-2.2" - "ruby-2.3" - "ruby-2.4"
Sequential Job
並列に実行できるのは素晴らしいけど,意図的に直列に実行したいという場合も多くある.そんなときは requires
を使う.デモでは build
ジョブを実行した後に deploy
ジョブを実行するようになっている.また,ジョブに対して実行するブランチを制限する filters
も使われていて,参考になる.
workflows: version: 2 build-and-deploy: jobs: - build - deploy: requires: - build filters: branches: only: sequential-branch-filter
さらに,デモでは .circleci/setup-heroku.sh
が用意されていて config.yml
から以下のように呼び出されている.このあたりのテクニックは CircleCI 1.0 と同じだけど,できる限り config.yml
の設定を薄く維持するというのは今後も意識したいと思う.
jobs: (中略) deploy: (中略) steps: - checkout - run: name: Setup Heroku command: bash .circleci/setup-heroku.sh
Fan-in / Fan-out
Fan-in と Fan-out は,一言で言えば「集約」のことで,ジョブパイプラインのようにジョブを直列に実行したり,並列に実行したり,複数のジョブの完了を待機することができる.ただし,これは既に紹介した requires
を使うだけで,専用の機能があるわけではなかった.設定ファイルだけだと読みにくいけど,ワークフロー図を見れば,意図した通りに構成できているかはすぐにわかる.
workflows: version: 2 build-and-deploy: jobs: - checkout_code - bundle_dependencies: requires: - checkout_code - rake_test: requires: - bundle_dependencies - precompile_assets: requires: - bundle_dependencies - deploy: requires: - rake_test - precompile_assets
Workspace Forwarding
CircleCI 2.0 の「ワークフロー機能」では,ジョブごとに独立したコンテナで実行されるため,一時ファイルなどを共有する場合,ジョブで作成したファイルをワークフローのワークスペースに保存し,他のジョブでマウントする必要がある.この機能は非常に便利だし,逆に知らないとワークフローの設定で苦労しそう.
設定としては2種類あり,まず attach_workspace
でワークフローのワークスペースをコンテナにマウントすることができる.次に persist_to_workspace
でワークフローのワークスペースにファイルを永続化する.なお,ワークフローのワークスペースにあるファイルを削除することはできず,あくまで追加だけとなる.また,CircleCI を使うなら,以下の3種類のデータの違いを理解しておく必要があるとドキュメントに書いてあった.
- Artifacts
- Workspaces
- Caches
version: 2.0 jobs: bundle_dependencies: docker: - image: circleci/ruby:2.4-node - image: circleci/postgres:9.4.12-alpine working_directory: ~/circleci-demo-workflows steps: - checkout - attach_workspace: at: ~/circleci-demo-workflows - restore_cache: keys: - v1-bundle-{{ checksum "Gemfile.lock" }} - run: bundle install --path vendor/bundle - save_cache: key: v1-bundle-{{ checksum "Gemfile.lock" }} paths: - ~/circleci-demo-workflows/vendor/bundle - persist_to_workspace: root: . paths: vendor/bundle rake_test: docker: - image: circleci/ruby:2.4-node - image: circleci/postgres:9.4.12-alpine working_directory: ~/circleci-demo-workflows steps: - checkout - attach_workspace: at: ~/circleci-demo-workflows - run: bundle --path vendor/bundle - run: bundle exec rake db:create db:schema:load - run: name: Run tests command: bundle exec rake (中略)
Schedule
GitHub の README.md
には書かれていなかったけど,ブランチ一覧を見てみたところ「スケジュール実行」のデモも用意されていた.CircleCI 2.0 では schedule
で cron 形式のジョブ実行ができる.よって,全ての git push
に hook するのではなく,深夜に1回実行するジョブ(例えば)を作ることができる.この機能を知らない人が結構いる気がして,知っておくと CI の幅が広がるのでオススメ!
workflows: version: 2 commit-workflow: jobs: - build scheduled-workflow: triggers: - schedule: cron: "0 1 * * *" filters: branches: only: try-schedule-workflow
関連記事
CircleCI 1.0 の設定ファイルを CircleCI 2.0 にマイグレーションをする「config-translation API」の紹介を前に書いた.