🪬

CI/CDとは?メリット・デメリットからちゃんと理解していく

2021/05/17に公開

CI/CD についてビルド・テスト・デプロイを自動化することってぐらいのイメージしかないので、ちゃんと調べて理解していきたいと思います。

「CI」「CD」はそれぞれ違う

「CI/CD」と一緒にされていることが多いと思いますが、 CI と CD ではそれぞれ意味が違います。

CI は、継続的インテグレーション ( Continuous Integration ) と呼ばれています。

CD は、継続的デプロイ ( Continuous Delivery ) または、継続的デプロイメント ( Continuous Deployment ) と呼ばれていています。

継続的とかインテグレーションとかデリバリーよくわかりにくいので、それぞれ噛み砕いて理解していきたいと思います。

CI とは

前述の通り、 継続的インテグレーション ( Continuous Integration ) のことです。

調べると以下のような内容で出てきます。

  • 「ソフトウェア開発のプロセスを自動化することで開発者がソースコードをコミットし、共有しているリポジトリにマージされることでビルドとテストが自動的に実行される手法である。」
  • 「ソフトウェア開発において、ビルドやテストを自動化し、短期間で品質管理をする手法のこと。」
  • 「開発者が自分のコード変更を定期的にセントラルリポジトリにマージし、その後に自動化されたビルドとテストを実行する DevOps ソフトウェア開発の手法である。」

継続的とかインテグレーションとかだとよくわかりませんでしたが、 リポジトリへのアクションをトリガーにして自動でビルド・テストをする手法 という理解としとけばわかりやすいかなと思います。

CD とは

CD は、継続的デリバリー ( Continuous Delivery ) または 継続的デプロイメント ( Continuous Deployment ) のことです。
同じ意味で使用されることもありますが、自動化の程度を表すために区別して使用されることもあるようです。

継続的デリバリーとは

開発者によるアプリケーションへの変更に対して、バグがないか自動的にテストし、リポジトリにアップロードをすることです。

テストされたソースコードを自動でアップロードしデプロイ可能な状態にする手法 ということですね。

継続的デプロイメントとは

開発者による変更をリポジトリから本番環境に自動的にリリースし、顧客が使用できるようにするというものです。

アップロードされたソースコードを自動的に本番環境にリリースする ということですね。

CI/CD をここまでさっくりとまとめ

ci/cd flow 図

CI/CD とは-継続的インテグレーション/継続的デリバリー|Red Hat より引用

CI/CD とは、継続的インテグレーションと継続的デリバリーを繋げた作業習慣を指したり、継続的インテグレーション・継続的デリバリー・継続的デプロイメントという 3 つの作業習慣を繋げたものを指すこともあります。

また、継続的デリバリーが継続的デプロイメントを含んだ意味で使用されることもあります。

用語的には色々な意味合いがあるようなので、 CI/CD とはビルド・テスト・デプロイの自動化を行うプロセス だと理解しておくといいかなと思います。

  • 継続的インテグレーション
    • リポジトリへのアクションをトリガーにして自動でビルド・テストをする手法
  • 継続的デリバリー
    • テストされたソースコードを自動でアップロードしデプロイ可能な状態にする手法
  • 継続的デプロイメント
    • アップロードされたソースコードを自動的に本番環境にリリースする

CI/CD の導入

「CI/CD とは何か」というところは大体分かったのですが、何を目的に導入するのか、どんなメリット・デメリットがあるのかなどを説明できる必要があると思うので、そこらへんも知っていけたらと思います。

メリット

まず導入するメリットにはどのようなものがあるでしょう。

  • 自動化することでビルド・テスト・デプロイのコスト削減
  • デプロイなどのコストが下がることで、細かいリリースを行える
  • コードのバグを早期に発見できるので、影響範囲が少ないうちに修正が可能
  • デプロイまでの作業を自動化することで、属人化せずに済む
  • テストやコーディング規約のチェックを頻繁に自動で行うことで、コードの品質がある程度保たれる

など、 CI/CD を導入することで得られるメリットはかなり高いかなと思いました。

デメリット

では反対に、デメリットにはどのようなものがあるのでしょうか。

  • 自動化させるためにビルドスクリプトなどを作成する必要があるので、導入コストが高くなる
  • 継続的にリリースしないような場合の費用対効果が見込めない

ぐらいでしょうか。

デメリットについてはこの辺りしかないように見受けられました。他にあるようでしたら教えてください。

どういう場合に導入をするのか

メリット・デメリットからわかったのは、 CI/CD はアジャイル開発において力を発揮するのかなと考えられます。

アジャイル開発は小さな単位でリリースを繰り返して開発を進めていきます。

そのため頻繁にデプロイを行うことになるので、 CI/CD のデメリットである「導入コスト」よりメリットの恩恵を大いに受けられるかなと思います。

対して、ウォーターフォール開発ではメリットを活かせず、デメリットの方が高いのかなと考えられます。

また DevOps においては、運用チームと開発チームの素早い連携が必須ですので、運用チームからの仕様変更に素早く対応してリリースする必要があります。

なので、 DevOps において CI/CD はほぼ必須のプロセスと言えるかなと思います。

ウォーターフォール開発ではデメリットが高いと前述しましたが、 CircleCI や GitHub Actions などのツールの発達により、最近は導入コストがそこまで高くなくなったかなと思います。

ステージング環境への CI/CD だとか、ビルド・テストだけを行うとかで活かせると思うので、ウォーターフォール開発においても CI/CD を導入するメリットは高そうです。

まとめ

CI/CD とは何か、どういうメリットがあって導入するのかなどが理解できたかなと思います。

また、アジャイル開発・DevOps において、 CI/CD はほぼ必須で導入するぐらいのものに思えました。

今後は実際に GitHub Actions などで自動化を実際に実装してみたいと思います。

参考

https://www.redhat.com/ja/topics/devops/what-is-ci-cd

https://cloudbees.techmatrix.jp/blog/struggle-story-about-ci-2/

https://www.buildinsider.net/enterprise/devops/01

Discussion