これからCI/CDを導入する方にも、すでに活用されている方にも、CircleCIを通してCI/CDに対する理解を深めるお手伝いができれば幸いです。
対象読者
- 前回の記事を読んでCI/CDに興味を持たれた方
- CI/CDについて学びたい方
- CircleCIのワークフローを使ってみたい方
- 新機能Orbsについて詳しく知りたい方
必要な環境/知識
- GitHubのアカウント
- ソフトウェアのテストについての一般的知識
- アジャイル開発についての一般知識
筆者について
CircleCIの元開発者で、現在はCircleCI初の海外支社であるCircleCI Japanでさまざまな活動を行っています。
CI/CDパイプライン
CircleCIでワークフローと呼ばれる機能は、実は似たような名前で他のCI/CDサービスやツールにも用意されています。例えばCircleCIと同じくSaaS版CI/CDの代表であるTravis CIには"Build Stages"がありますし、Jenkinsには"Pipeline"という機能が存在します。
どれも呼び方は違いますが、これらはすべてCI/CDパイプラインを実現するための機能です。CI/CDパイプラインとはCI/CDで行われる処理を論理的にまとめて、それらを順番に実行していくことを意味します。
この説明だけだとよく分からないですね。具体的に例を出して説明すると、あるアプリケーションのCI/CDを回そうとしたときはだいたい以下のような処理が必要となります。
- 依存関係のインストール
- 静的コード解析
- テストの実行
- デプロイメント
これらの各処理を個別に定義して、パイプラインとして実行します。パイプラインとは日本語で管の意味で、CI/CDの処理が管の中を通って順番に実行されるのでそう呼ばれています。
パイプラインを使う一番のメリットはCI/CDの処理を分割できることです。そうすれば各処理を並列に実行したり、「if 処理1 then 処理2」のようなフローを作ったりすることができます。例えば、先ほどの例だと静的コード解析とテストの実行は並列で実行できそうです。また、デプロイメントをテストが成功した時だけ実行するように設定すれば安全にリリースの自動化を行うことができます。
このように、パイプラインは複雑な手順を抽象化して扱う手助けをしてくれるので、モダンなCI/CDには必須の機能となっています。また最近ではCI/CDベンダーではないGitHubもGitHub Actionsと呼ばれるパイプライン機能を発表したことで、パイプラインの重要性はCI/CDの世界を超えて認識されつつあります。
ワークフローの設定
それでは実際にCircleCI上でワークフローを設定していきましょう。サンプルコードは前回と同じRuby On Railsで書かれたブログアプリを使います。
前回の内容を簡単におさらいすると、このブログアプリのCI/CDを回すためにbuild
というジョブを定義して、その中で依存関係のインストールやテストの実行ができるように設定しました。
依存関係のインストール、静的コード解析、テストの実行をそれぞれのジョブに切り出すところから始めましょう。最終的な設定を全部書くと紙面を取るので、ここでは完成形の.circleci/config.yml
へのリンクだけを掲載しておきます。
ジョブの定義方法については前回解説したので、ここではワークフローに関する部分だけを見ていきましょう。
version: 2 jobs: install_dependency: <省略> run_test: <省略> run_lint: <省略>
まず、それぞれのジョブをjobs
配下に定義します。
workflows: version: 2 test-and-lint: jobs: - install_dependency - run_test: requires: - install_dependency - run_lint: requires: - install_dependency
そして、それらのジョブをworflows
でまとめます。
- workflows:ワークフローの定義を開始します。
- version: 2:ワークフローのバージョンを指定します。2018年12月の時点では2のみ指定可能です。
- test-and-lint:このワークフローの名前を指定します。分かりやすい名前であればなんでも構いません。
- jobs:実行するジョブを指定します。
-
requires:このジョブを実行する前に実行されるべきジョブを指定します。この例では、
run_test
とrun_lint
のジョブは必ずinstall_dependency
のあとに実行されます。複数のジョブをrequires
することも可能です。
この.circleci/config.yml
をGitHubへプッシュするとCircleCIでtest-and-lint
という名前のワークフローが開始されます。
このようにワークフローを使うと設定を分割できるだけではなく、CI/CDの全体の流れが可視化できるようになり、とても便利です。
requiresの補足説明
requires
を使わずにジョブを書くと各ジョブが順番に実行されるように思うかもしれませんが、実際にはすべてのジョブが並列で実行されます。ジョブを順番に実行したい場合は、下記のようにrequires
を使う必要があります。
jobs: - job1 - job2: requires: - job1 - job3: requires: - job2
なお、無料枠でCircleCIを使用している場合、並列ビルドができないのでrun_test
とrun_lint
は1つずつしか実行されません。