DevOpsとは、簡単に言ってしまえば開発(Dev)と運用(Ops)が協力して、開発やリリースのスピードを上げていくための方法論です。勘違いしやすいかもしれませんが、DevOpsはあくまで方法論であり、特定の技術や手法を指す言葉ではありません。そのためDevOpsを実現するためには、もう少し粒度の細かい技術やツールが必要となります。
CIとは継続的インテグレーション(Continuous Integration)、そしてCDとは継続的デリバリー(Continuous Delivery)を略した呼び名です。一般的にはこのふたつを組み合わせ、CI/CDと呼ぶことが多いようです。この記事では、DevOpsを構成する重要な要素のひとつであるCI/CDとは何かを解説します。
継続的インテグレーションとは
継続的インテグレーション(以下CI)とは、変更されたコードに対し、自動化されたテストを継続的に行う手法のことです。
例えば、変更したコードをリリース対象のブランチへマージすることを考えてみましょう。CIが行われているプロジェクトでは、マージ前に自動的にテストが行われ、テストをパスした場合にのみコードのマージが許可されます。これにより、リリース対象のブランチにマージされたコードはテストをパスしているということが保証されます。つまりCIを行うことにより、コードが意図通りに実装されているか、また既存のコードを破壊していないかといった問題を早期に検出できるのです。
またテストは自動的に行われるため、CIはリリースされるコードの品質を担保するだけでなく、リリースにかかる各種作業の省力化や高速化にも貢献します。リリースサイクルを高速に回すことを求められるアジャイル開発において、CIの実施は必須と言ってよいでしょう。
継続的デリバリーと継続的デプロイとは
継続的デリバリー(以下CD)とは、CIをパスしたコードをビルドし、リリース可能な状態にする作業を自動化する手法のことです。
CIによるテストをパスし、リリースブランチにマージされたコードは、実際にステージング環境や本番環境へデプロイしなければなりません。そこでコードをビルドし、いつでもリリース可能な状態を整えるのがCDの役目です。ただし、CDはあくまで「リリース可能な状態を作り出す」のであり、実際にリリース作業自体を自動的に行うわけではないことに注意してください。CDが行われていても、本番へのリリースのGo/NoGoは人間が都度判断して行います。
もちろん、実際のリリースまでを完全に自動化することもあります。こうした手法は継続的デプロイ(Continuous Deployy)と呼ばれ、区別されます。継続的デプロイもCDと略されることが多いため、混同しないよう注意してください。
CI/CDを実現するツール
テスト・ビルド・デプロイという、いわゆるCI/CDパイプラインを構築するには、専用のツールやサービスを利用するのが一般的です。
ソープンソースの自動化サーバーとして、最も有名なプロダクトがJenkinsでしょう。CI/CDサービスを自前で構築したい場合、特にオンプレミス環境で動作することが求められている場合であれば、第一候補となるのではないでしょうか。
CI/CDはプロダクトの品質やリリース速度に大きく貢献する手法ですが、CI/CDを実施するサービスの違いが、ビジネスの価値に直接コミットするわけではありません。あくまでツールに過ぎないものに、余計な運用工数をかけたくない、可能であればアウトソースしたいと考えるのは自然なことでしょう。そういう場合は、CI/CDサービスを提供するSaaSを利用するのがお勧めです。有名なサービスにCircleCIやTravis CIがあります。
CI/CDはコードの変更をトリガーとして起動するのが一般的です。そこでソースコードホスティングが提供するCI/CDサービスを使うのもよいでしょう。例えばGitHubのGitHub Actionsや、GitLabのGitLab CI/CDなどです。
クラウドベンダーによっては、自社クラウド環境向けにCI/CDパイプラインを提供している場合もあります。例えばAWSであれば、コードのテストとビルドを行うCodeBuild、ビルドしたコードのデプロイを行うCodeDeploy、そしてこれらのCI/CDパイプラインを自動化するCodePipelineなどが用意されています。
具体的なCI/CDフロー
前述のどのツールを利用したとしても、CI/CDパイプラインの基本的な発想は同じです。典型的なワークフローは以下のようになるでしょう。
まずリポジトリの作業用ブランチへコードがコミットされたことをトリガーに、CIが自動的に起動します。CIは事前に定義された設定に基いて、様々なテストを実施します。例えばRubyのコードであればRSpec、PHPのコードであればPHPUnitなどがここで実行されることになるでしょう。また単体テストだけでなく、静的コード解析や他にもセキュリティチェックなどを行うこともあります。
テストにパスしたコードは、リリースブランチへのマージが可能となります。そしてマージされたことをトリガーに、CDが起動してビルドを行います。具体的にはコードのコンパイルや、最近であればコンテナイメージのビルドや、コンテナレジストリへのプッシュなどが該当します。
DevOpsとCI/CD
CI/CDはテストを行うことでコードの品質を担保すると同時に、リリースサイクルを高速化するためには欠かせない手法です。
最近はアプリケーションだけでなく、インフラもコード化して管理するのが一般的となってきています。これをInfrastructure as Code(IaC)と呼びますが、CIを利用すれば、こうしたインフラを構成するコードも自動でテストが可能になります。またテストのみならず、CDを利用すればインフラのコードの変更をトリガーとして、実際にインフラ構成を変更することも簡単です。特にAPIからインフラを制御できるクラウドを使っているのであれば、IaCとCI/CDのシナジーは非常に強力です。
DevOpsとはそもそも、開発スピードや新機能を重視するDevと、安定性や現状の維持を優先するOpsの間のギャップを解消し、開発サイクルを高速化しようという考え方に他なりません。コードのテストやリリースというとDev側にフォーカスされがちですが、DevOpsを実践するには、Ops側にとってもCI/CDは重要な手法になると言えるでしょう。