CI/CDとは何ですか? 継続的インテグレーションと継続的デリバリー
⚡ スマートサマリー
継続的インテグレーションとは、チームメンバーが少なくとも毎日、各自の作業を共有リポジトリに統合し、コミットごとに自動ビルドとテストを実行して統合エラーを早期に検出するソフトウェア開発手法です。

継続的インテグレーション (CI) とは何ですか?
継続的インテグレーション これは、チームメンバーが少なくとも1日に1回は各自の作業を統合するソフトウェア開発手法です。すべての統合は、エラーを検出する自動ビルドによって検証されます。この概念は、統合をプロジェクトの終盤まで先延ばしにすることで発生する「統合地獄」を回避するために、20年以上前に導入されました。
コードのコミット後、ソフトウェアは直ちにビルドされ、テストされます。開発者が多い大規模プロジェクトでは、コミットは1日に何度も行われます。コミットごとにコードがビルドされ、テストされます。テストに合格すれば、ビルドはデプロイ可能かどうかチェックされ、デプロイが成功すれば、コードは本番環境にデプロイされます。このコミット、ビルド、テスト、デプロイのサイクルは継続的に行われるため、この手法は「デプロイ」と呼ばれています。
継続的デリバリー (CD) とは何ですか?
連続放出 これは、チームが短いサイクルでソフトウェアを開発し、いつでも確実にリリースできるようにするソフトウェアエンジニアリング手法です。その目的は、ソフトウェアを迅速かつ頻繁に構築、テスト、リリースすることで、頻繁な本番環境へのアップデートを通じて変更を提供する際のコスト、時間、リスクを削減することです。
CIとCDの違い
継続的インテグレーション これは、コードベースへの変更を毎回自動的にテストするアプローチであるのに対し、継続的デリバリーは、新機能、設定、バグ修正などの変更を安全かつ迅速に本番環境に導入するアプローチです。
CIなしの開発 vs. CIありの開発
| CIを使用しない開発 | CIを使った開発 |
|---|---|
| バグが多い | バグが少ない |
| 頻度の低いコミット | 定期的なコミット |
| リリース頻度が低く、リリースが遅い | 定期的な動作リリース |
| 難しい統合 | 簡単かつ効果的な統合 |
| テストが遅くなる | 検査は早期かつ頻繁に行われる。 |
| 問題の解決はより困難になる | 問題の発見と解決がより迅速に行われる |
| プロジェクトの可視性が低い | プロジェクトの可視性の向上 |
コンパイルと継続的インテグレーションの違い
コンパイルはコードを機械語に変換するだけですが、CIはより広範な活動をいくつか実行します。
- データベース統合: データベースとコードを同期させ、データベースとテストデータの作成を自動化します。
- Code 検査: 健全なコードベースを確保し、問題を早期に特定し、ベストプラクティスを適用します。
- 自動展開: いつでも製品をリリースでき、常にデモ可能な状態を維持できます。
- ドキュメント生成: ドキュメントを最新の状態に保ち、ビルドレポートとメトリクスを作成します。
- コンパイル: 高水準コードを機械語に変換し、すべての対象プラットフォームでコンパイルできることを保証します。
理想的には、ビルドはIDEに依存するのではなくコマンドラインから実行され、専用のCIサーバー上で継続的に実行され(cronジョブではない)、チェックインのたびにトリガーされ、開発者の労力を必要とせずに即座にフィードバックを提供する。
CIプロセスを実施するために必要なものは何ですか?
- バージョン管理システム (VCS): プロジェクトに加えられた変更を一元管理し、長期にわたって保存するための信頼性の高い方法。
- 仮想マシン: 予備のサーバー、もしくは少なくとも1台 バーチャルマシン システムを構築します。
- ホスト型CIツールソリューション: サーバー管理の手間を省くため、ホスティングソリューションはプロセス全体を管理し、拡張性にも優れています。
- ツール: セルフホスト型を選択する場合は、次のような CI ツールをインストールしてください。 Jenkins, TeamCity, BambooまたはGitLab。
継続的インテグレーションはどのように機能するのか?
古い例としては、かつてナイトリービルドと呼ばれる手順を採用していたノキアが挙げられます。日中に多くの開発者がコミットを行い、毎晩ソフトウェアがビルドされていました。しかし、ビルドが1日に1回しか行われなかったため、大規模なコードベースにおけるエラーの特定、検出、修正は困難を極めました。
Later チームは継続的インテグレーションを採用した。開発者がコードをコミットするとすぐにソフトウェアがビルドされ、テストされるため、エラーは即座に検出され、担当開発者は迅速に不具合を修正することができた。
CIの特徴
- 単一のソースリポジトリを維持管理できます。
- 本番環境に近い環境で、本番環境のクローンをテストできます。
- 常に最新ビルドを利用できるようにしています。
- ビルド、テスト、デプロイの全プロセスをすべての関係者に可視化します。
なぜCI(継続的インテグレーション)を使うのか?
- より高品質なソフトウェアの開発と、再現性のあるテストの実施を支援します。
- エンジニアリングチームの成果物の提供規模を拡大し、開発者が複数の機能を並行して開発できるようにします。
- チーム全体の可視性とコミュニケーションを向上させます。
- 問題が発生した際に即座にフィードバックを提供し、導入をより迅速かつ予測可能にすることでリスクを軽減します。
- 発売直前の混乱を回避します。
CIシステムを使用する際のベストプラクティス
- 早めに、そして頻繁にコミットし、決して不具合のあるコードをコミットしてはならない。
- ビルドの失敗は直ちに修正し、指標に基づいて行動する。
- すべてのターゲット環境でビルドを行い、すべてのビルドから成果物を作成します。
- ビルドプロセスを自動化し、IDEに依存しないようにする。
- データベーススキーマを含め、変更があった場合はすべて構築してテストしてください。
- ビルドを高速化し、自動デプロイを活用しましょう。
CIのデメリット
- CIサーバーに慣れるには、初期設定とトレーニングが必要です。
- 適切なテスト手順を開発する必要があり、質の高いテストスイートを構築するには相当なリソースが必要となる。
- 使い慣れたプロセスを変換する必要があり、追加のサーバーと環境も必要となる。
- 複数の開発者が同時にコードを統合しようとする場合、待ち時間が発生する可能性があります。
CIプロセス用ツール
Jenkins
Jenkins は、オープンソースの継続的インテグレーションツールで、 Javaこれにより、大規模なコードベースにおける個々の変更点についてリアルタイムでのテストとレポート作成が容易になり、開発者がビルドテストを自動化しながら、欠陥を迅速に発見して解決できるようになります。
Bamboo
Bamboo は、自動ビルド、テスト、リリースを1か所で実行する継続的インテグレーションビルドサーバーです。Jiraとシームレスに連携し、 Bitbucket また、Docker、Git、SVN、Mercurial、AWSなど、多くのテクノロジーをサポートしています。
TeamCity
TeamCity は、多くの強力な機能を備えた継続的インテグレーションサーバーです。ビルドが実行されていない時でもCIサーバーを健全かつ安定的に稼働させ、あらゆるプロジェクトのコード品質を向上させます。
