このすみノート

Webエンジニアが技術や趣味を書くブログです。

CIとCDの違いを、自分なりに整理してまとめてみた

「AWSで実現するモダンアプリケーション入門」を読んでいるのですが、「リリースパイプラインの構築」でCIとCDという用語が登場しました。

大抵のケースでCI/CDはセットで語られている気がするのですが、細かな違いが気になったのでメモします。

CI/CDは、それぞれ何の略語なのか

  • CI: Continuous Integration、継続的インテグレーション
  • CD: Continuous Delivery、継続的デリバリー
  • CD: Continuous Deployment、継続的デプロイメント(継続的デプロイ)

CDには、調査した限り2通りの呼び方がある点に注意が必要です。

継続的インテグレーション

CIは継続的インテグレーションと呼ばれています。 CircleCIの説明がわかりやすいです。

CIとは、継続的インテグレーション(Continuous Integration)の略であり、デプロイするコードの品質を確保しながら、開発スピードを向上させる DevOps ソフトウェア開発手法です。
開発者は継続的にコードを少しずつ (少なくとも 1 日 1 回、可能なら 1 日に数回) コミットし、そのコードが共有リポジトリにマージされる前にビルドとテストが自動的に実行されます。

引用: https://circleci.com/ja/continuous-integration/

説明には、ビルドとテストが実行されるとあります。

ビルドに失敗するソースコードではないかチェックしたり、ユニットテストを実行してソフトウェアの品質に問題が発生していないかを、コミットやプッシュの契機などで継続的に自動確認するイメージです。

CIは自動チェックによる品質の向上や、自動化による開発チームの生産性向上を主目的として実現されます。

継続的デリバリーと継続的デプロイメント

継続的デリバリーという言葉が浸透していますが、現在であれば、継続的デプロイメントのほうが意味合い的に近いかもしれません。

継続的インテグレーション(CI)
新しいコミットごとに自動でアプリケーションのビルドとテストを行います。

継続的デリバリー(CD)
アプリケーションをいつでもデプロイできる状態にします。実際にアプリケーションをデプロイするには、手動の操作が必要です。

継続的デプロイメント
ビルド、テスト、デプロイメントを自動で行います。すべてのテストに合格すると、新規のコミットごとに新しいコードが開発パイプライン全体を通過して本番環境にプッシュされます。手動の操作は介在しません。

引用: https://circleci.com/ja/continuous-integration/

イメージとして、継続的インテグレーションの発展形が、継続的デプロイです。 継続的デプロイでは、継続的インテグレーションのビルド・テストに加えて、デプロイも自動実行します。

もしくは、継続的デプロイは継続的インテグレーションが実現することを内包している、とも言えます。

CI/CDの片方だけを実践するパターン

CI/CDは常にセットのイメージが強いのですが、各用語が目指す実際の目的を鑑みると、片方だけ実現するパターンも存在しそうです。

  • デプロイまでせず、単にユニットテストだけを実行するなら、CIのみになります。
  • ソースコードを含めたDockerイメージを作成して、単にデプロイだけを実行するなら、CDのみになります。

もちろん、CIを含めたCDを実行するのが理想形だと思います。

しかしながら、テストが書かれていないアプリケーションでは、単に自動リリースだけを実現したらCIを含まないCDになりそうです。

AWSのCode兄弟で例えた場合

CI/CDの役割を、AWSのサービス(Code兄弟)で例えてみます。

  • CodeBuild: CIを担当
  • CodeDeploy: CDを担当
  • CodePipeline: CI/CDの全体フローを制御する役割

CodeBuildとは何たるかを追求すればCIが理解でき、CodeDeployとは何たるかを追求すればCDに詳しくなれそうです。

まとめ

CI/CDが実行するプロセスを、ビルド・テスト・デプロイに分けて考えると違いがわかりやすいです。

  • CI: ビルド、テスト
  • CD: ビルド、テスト、デプロイ

そして、CDには「Continuous Delivery、継続的デリバリー」「Continuous Deployment、継続的デプロイメント」という、2通りの呼び方があります。 CircleCIの解説では、継続的デリバリーと継続的デプロイには、デプロイが手動か自動かの差分がありました。

ただし、これはあくまで私の個人的な感想ですが、実際は継続的デリバリーも自動デプロイのニュアンスで用いられている気がします。 なので、継続的デリバリーと継続的デプロイメントの明確な違いを意識する局面は、意外と少ないかもしれません。