CircleCI2.0のWorkflowsを導入してみた

timakin
timakin
Jun 18, 2017 · 9 min read

概要

CircleCI2.0にWorkflowsという機能が導入されました。

他のビルドツールで既にあった、ビルドパイプラインと考えればわかりやすいと思います。 これを導入すると何が嬉しいかというと、

  • ビルドの実行フェーズを複数に分けることで、どこでFailしたかなどが視覚的に掴みやすい
  • 並列にjobを実行させることで通常の同期的なビルドフローよりも効率良く回せる
  • 具体的にはbundle installとかnpm installとかを並列に回して、共有ディレクトリに結果を入れたりできる
  • 色々並列にjobを回したあと、それを待ち受けて最終的な結果を同期的に受け取ることもできる
  • branchや言語のバージョンによって別々でテストを回したい時などに別個かつ並列にビルドを行える
  • 外部APIにつなぎにいく時にfailした場合などでは、Rerun from failedができるので、ケースによっては全工程をなぞる必要がなくなる

などのメリットがあります。

早速自分のこれまでのcircle.ymlの設定を変えて試してみました。元にした設定が載っているのはこの記事です。

今回はcircleci公式のリポジトリの設定を参考に作り直してみたので、割とデファクトスタンダードな書き方によっているはずです。 書き方の面での変更点としては、

  • referencesを使って定数をまとめているところ
  • primary imageにdocker clientのインストールコマンドを組み込んだので、それをyamlから除去したところ

です。

具体的な設定

長いので端折って書くと、jobsで個別のフローを定義して、workflowsでそれをどんな依存関係で、どんな順番で行うかを定義しています。

具体的に何をしているかというと、サンプルとして2つのジョブを実行していまして、以下がその内容です。

checkout_code job

  • ソースをcheckoutしてくる

spec job

  • ansibleのテスト用のdocker containerを立てる
  • serverspecテストの実行

workflowsで特徴的な点

いくつかworkflowsを利用するにあたって設定を変更しましたが、syntax以外に下記の点が重要になってきます。

それぞれのジョブで必要な環境のセットアップ

<<: *container_configという書き方でビルド用のprimary imageを読み込んでいます。

今回は一個のimageを使っているので、全てのジョブで上記のコンテナ設定を読み込めばいいですが、

もし言語のバージョンごとにビルド用のprimary imageを変える時などは、上記設定を個別に行う必要があります。

ジョブ間での成果物共有

persist_to_workspaceというオプションで、checkout_codeジョブでcheckoutしてきたコードを、specジョブに共有しています。

これがないと、各ジョブ内部の環境は区別されて、せっかくフローの流れを定義しても意味がないので注意しましょう。

依存パッケージのインストールなどを並列で行う場合は、上記のオプション経由で一つのディレクトリにまとめた後、deployなりtest回すなりすればいい、ということになります。

ビルドの依存関係・順序の定義

以下の設定が、今回のworkflowsの導入によるメインの差分です。 build_and_testのところは、build_and_test_and_deployなり好きに設定してください。

requiresというオプションで、そのジョブにはどんな依存関係があるかを記載しています。 もしこれを設定しなければ、そのジョブに依存する次のジョブまでは、特に制限なく並列でビルドが行われます。

また、filtersというオプションでビルド用ブランチを指定したりできます。

注意点として、requiresのオプションを、specという文字列から半角スペース4つ分あけて記入しないと、ビルドがそもそも始まらなくてエラーも出ないなどのバグが起きます。特定に時間がかかって体力が消費されました。

まとめ

上記の通り、少し設定を変えるだけでworkflowsの恩恵を得ることができます。

今回の例は2ステップしかないのと、別に並列に回すものでもなかったのですが、フロントエンド、バックエンドの両方で依存パッケージが多い、中・大規模なAPIのビルド & デプロイには重宝しそうです。

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store