CI/CDの概要や流れなどについて整理する

CI/CDの概要や流れなどについて整理する

2020年12月19日
まとめ系

普段何気なく使っている技術や言葉について、表面的な知識にせず、しっかりとイメージできるまで自分なりに調べて整理し、理解するシリーズ。

CI/CDとは一言でいうと何か?

CI/CDとは、一言でいうと「ビルド、テスト、デプロイを自動化し、継続的に行う手法」のことです。

 

CI/CDが使われている背景

近年、ソフトウェア開発の規模はより大きく、複雑化しており、開発する機能を小さく区切り、継続的に開発、テスト、リリースというサイクルを回していく「アジャイルソフトウェア開発」を実施する例が増えています。

少しずつ機能を追加できるアジャイル開発では、必然的にリリースの回数が増加するため、テストやビルド、デプロイといった作業が多くなります。

CI/CDは、これらの作業を自動化するための手法で、作業効率を上げ、属人性を排除することができるため、広く使われるようになっています。

 

CI(Continuous Integration)

「CI」とは「Continuous Integration(継続的インテグレーション)」の略で、ソフトウェア開発におけるビルドやテストを自動化し、チームのメンバーが頻繁に作業を統合するソフトウェア開発の手法のことです。

小さなサイクルでインテグレーションを繰り返し行い、インテグレーションのエラーを素早く修正することによりチームは統合されたソフトウェアをより迅速に開発できるようになります。

CIツールを使わない場合のCIの基本的な流れ

① リモートリポジトリに自分の変更をPushする前に手元のローカル開発環境でビルドとテストをして正常にパスすることを確認する

② 開発チームにインテグレーションすることを伝え、他のメンバーには対象リポジトリに何も触らないように伝える

③ リモートリポジトリに自分の変更をPushする

④ 別のCI専用マシンで自分のPushした変更がビルドとテストが正常にパスすることを確認する

⑤ 開発チームにインテグレーションが完了し、リポジトリをアップデートできることを伝える

※ アプリケーションのソースコードをビルドし、テストすることをインテグレーションと呼ぶ

 

CIツールを使ったCIの基本的な流れ

① リモートリポジトリに自分の変更をPushする

② リモートリポジトリの対象ブランチにコミットされたことをトリガにCIサーバーが変更を検知

③ CIサーバーがGitからソースコード・リポジトリの内容をコピー

④ CIサーバーが指定されたスクリプト・ワークフローを実行

⑤ 実行結果をメールやチャットなどに送る

CIのメリット

  • インテグレーションする度にバグや不具合を発見できる
  • CI環境で毎回ビルドし直すことで環境依存を排除できる
  • 手動作業から解放されることで時間やミスを低減できる
  • 常にバグや不具合のない最新のソースコードにアクセスすることができる
  • コード変更やリファクタリングに対する心理的抵抗が低くなる

 

CD(Continuous Delivery)

「CD」とは「Continuous Delivery(継続的デリバリー)」の略で、CIによってビルド・テストが行われ、本番環境にデプロイが可能な状態を整えるプロセスのことです。実際にリリースするかはビジネス側に委ねられます。

また「CD」は「Continuous Deployment(継続的デプロイ)」の略として使われることもあり、CIによってビルド・テストが行われ、本番環境へのデプロイを行うことを指します。

Continuous DeliveryとContinuous Deploymentの違いは最後のリリースがビジネス側の判断に委ねられているかどうかにあります。Continuous Deployment に制限を加えたものが Continuous Deliveryともいえます。

まとめるとCDはCIを拡張した手法で、ソフトウェアの最大の目的である「高品質かつ迅速にユーザーに価値を提供する」ために、ビルドやテストだけでなく、デプロイに至るまでのリリースプロセス全体を自動化し整えることだと認識しました。

開発者としてはいつでもリリースできる状態に自動化しておくことが大事かと思います。

CDのメリット

  • こまめにデプロイすることで、デプロイのリスクを減らす
  • デプロイの進捗状況が確認できる

 

CI/CDの種類

CI/CDには大きく分けてオンプレミス型とクラウド型があり、オンプレミス型としてはJenkins、クラウド型としてはCircleCIが有名です。オンプレミス型は一般的に拡張性が高い一方、自分たちで構築・運用する管理コストが発生します。

クラウド型は拡張性が低いが、サーバーなどを自前で用意する必要がなく、すぐに使い始めることができます。

オンプレミス型

  • Jenkins
  • Concourse CI
  • Drone

など

クラウド型

  • Travis CI
  • CircleCI
  • Wercker
  • AWS CodeBuild
  • GCP Cloud Build

など

どちらを選ぶかはチーム次第ですが、よほど大規模な組織でCI/CDを専任で運用できるチームがない限り、インフラの管理コストがかからないクラウド型がおすすめです。

 

まとめ

  • 高品質かつ迅速にユーザーに価値を提供するための手段の一つとしてCI/CDの実践がある
  • 完全な自動化ができなくても良いが、パイプラインを構築して、いつでも継続的に本番環境にデプロイできるようにする

 

参考

https://codezine.jp/article/detail/11083

https://note.com/kazunori_kuroco/n/ndec237fb3a02

https://qiita.com/choco_p/items/1bd1b106daee1fbd4449

https://pfs.nifcloud.com/navi/words/ci_cd.htm

 

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

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