ホーム Topics 継続的統合 継続的インテグレーション(CI)とは
IBMの継続的インテグレーションのソリューションはこちら クラウド関連の最新情報を購読
ギア、ロボットアーム、携帯電話のピクトグラムのコラージュ付きイラスト

公開日: 2024年7月16日
寄稿者: Chrystal R. China、Michael Goodwin

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

継続的インテグレーション(CI)とは、開発者が開発サイクル全体を通じて新しいコードをコード・ベースに統合するソフトウェア開発のプロセスです。

CIツールは、コードが送信されると、ビルドのイテレーションを作成し、一連の自動テストを実行して各インテグレーションを検証し、統合エラーを迅速に検出して対処します。

CIは、従来のソフトウェア開発の課題、つまり統合とデプロイメントに関連するプロセスに対応するために作成されました。従来の開発では、各開発者は新しいコードをアプリやサービスの新しいイテレーションに手動で統合する責任を負っていたため、特に大規模な開発チームの場合には、統合に時間がかかり、そのプロセスにはエラーが発生しやすくなっていました。

異なるコードが常にうまく連携するとは限らず、開発者は異なるタイムラインで、場合によっては土壇場で変更を統合するために、統合の問題に関するフィードバックが遅れることがよくありました。統合が一貫しないことに伴う遅延により、チームではどの変更がバグを引き起こしたかを把握するのが難しくなり、デバッグも骨の折れるプロセスになっていました。

さらに、ソフトウェアのテストは頻繁には行われず、一度に大規模なバッチ更新が行われるため、バグがその隙間をすり抜けてコード・ベースに蓄積され、エンド・ユーザーにエラーや不具合をもたらす可能性がありました。(つまり開発者にとってはトラブルシューティングがより困難になるのです。)

CIツール(最新のDevOpsプラクティス、継続的インテグレーション/継続的デプロイメント(CI/CD)パイプラインマイクロサービス・アーキテクチャーの土台となります)は、統合パフォーマンスについての迅速なフィードバックを可能にすることで、ビルド・プロセスの効率化を助けます。

CIシステムを使うと、新しいコードは中央リポジトリーに(通常は1日に複数回)追加されビルドとテスト用に同リポジトリーに残ります。CIシステムはエラーを検出すると、通知を送信し、コードを修正し、更新されたコードが正しいことを確認してから、コード・ベースと完全にマージします。

したがってこのCI手法により、ソフトウェア開発チームはソフトウェアのパフォーマンスに影響を与える前にエラーを検出して修正できるようになり、より高品質なソフトウェアと予測可能なデリバリー・スケジュールを実現できます。

2023年IBMソフトウェア・デリバリー・レポート

ソフトウェア・デリバリーの効率化には、市場のDevOpsについての誇大宣伝に対応するのではなく、自社のDevOpsデータに基づき開発者のエクスペリエンスと生産性を向上することが大切です。

関連コンテンツ

IBM、2023年Gartner Magic Quadrantリーダーに選出

主要なCIコンポーネントとプロセス

継続的インテグレーション・システムの正確な構成は、チームごと、また企業ごとに異なりますが、いずれのCIシステムでも統合タスクを最適化するために、特定のコンポーネントとプロセスを用います。

ソースコードの中央リポジトリー

CIは、すべての開発者がコードをコミットする中央リポジトリーから始まります。中央リポジトリーはCIプラクティスの基礎として機能し、多くの場合、GitやBitbucketなどのバージョン管理システム(VCS)によって管理されています。開発者が変更を送信すると、中央リポジトリーが変更を追跡し、開発チームが効率的に共同作業ができるように、コード変更の完全な履歴を作成します。

リポジトリーでは、並列開発を容易にするために、トランクベース開発やGitFlowなどの分岐戦略も使用します。ブランチ機能を使うと、開発者は機能ブランチと有効期間の短いブランチを作成して独立した作業を行ったあとに、メイン・コード・ブランチにマージし直すことができます。

継続的インテグレーション・サーバー

CIサーバーは、さまざまなプラットフォーム向けのさまざまなプロジェクトを構築するように構成でき、すべてのCI操作を一元化し、ソフトウェア開発に最適な安定して信頼性の高いプラットフォームを作ることができます。(継続的デリバリー用に)ワークフローをモデル化して視覚化し、継続的デリバリー(CD)パイプラインを構築するための直感的なインターフェースを用意できます。

CIサーバーは、自動化されたビルド、テスト、リリースを実行し、バージョン管理プロトコルを調整し、コード・リポジトリーを監視し、ステータス・レポートを処理し、システム機能を強化できるプラグインをサポートします。

コード統合

CIシステムでは、開発者が毎日数回コード変更を送信することを奨励し、特定のタスクや機能に対する小規模で的を絞った変更を優先します。プル・リクエスト(説明)やマージ・リクエストなどのツールを使って、チームは新しいコードをマージする前に、コード・レビューを開始して問題について話し合うことができるので、エラーを早期に検出できます。

ビルドの自動化

継続的インテグレーション・サーバーとツール(Jenkins、CircleCI、GitHub、AWS CodePipeline、GitLab CIなどの人気のあるオープンソースのCIツールを含む)は、コードの変更を中央リポジトリーで監視します。新しい変更を検出すると、ビルド・サーバーはビルド・プロセスをトリガーして、定義済みのワークフローとビルド・スクリプトを実行し、テスト(および最終的にはデプロイメント)の準備としてコードをコンパイルしパッケージ化します。

自動化テスト

CIツールは、コードがコード・ベースにマージされる前に、さまざまなテストを実行してコードを検証します。ユニットテストは、個々のコンポーネントや関数を検証し、コードの動作に関するフィードバックを即座に提供します。統合テストは、ソフトウェア・コンポーネントやモジュール間の相互作用を評価し、それらが正しく連携して動作していることを確認し、ユニット・テストが見逃す可能性のある問題を検出します。

一部のCIワークフローでは、エンド・ツー・エンドのテストで、ユーザー操作のシミュレーションを行い、ソフトウェアがユーザーの視点から正しく動作しているかを確認して、ソフトウェアを検証します。またチームでは、コード品質テストと静的分析を実行して、負荷時のアプリケーションの応答性と安定性をチェックし、コーディング標準違反とセキュリティの脆弱性を特定することができます。

フィードバックの仕組みと成果物管理

CIサーバーは、ビルドまたはテストが失敗した場合に、すぐに開発者に通知します。障害が発生した場合、開発者はコードを優先して修復し、メイン・ブランチがデプロイ可能なままになるようにします。

ビルドが成功すると、サーバーは成果物(コンパイルされたバイナリー、Dockerイメージ、インストーラーなど)を生成します。これらの成果物はバージョン管理され、将来のテストやデプロイのために成果物・リポジトリーに保存されます。結果に関係なく、主要なCIシステムは統合の試行、成功率、その他の指標をログに記録し、チーム・メンバーがいつでも包括的なバージョンのドキュメントにアクセスできるようにします。 

CIにおけるコーディング・テストの重要性

テストは継続的インテグレーション・プロセスには欠かせない要素です。少なくともテストはCI作業の約3分の1を占めていますが、これはチームが単一のテスト・ステージを実行する場合のみの話です。実際には、テスト作業がCIツールのワークロードの大部分を占めることもあります。

CI環境での継続的テストは、開発者がビルドとパッケージ(インストール可能な実体またはパッケージ化された実体とも呼ばれます)を作成した時点で開始され、パッケージが本番環境に導入された時点で終了します。エンド・ツー・エンドのすべてのステップがテスト・スイートを構成します。

CIの自動テスト・プロセスの一環として、テスト駆動開発ではコードを繰り返しビルドし、1つのユースケースでテストを行います。その後、アプリケーションの機能領域全体でコードがどのように実行されたかをチームに通知します。

ただし、開発者がローカル環境ですべてのテスト(およびテストのサブセット)を実行し、新しいコードの変更がテストに合格した後にのみソースコードをバージョン管理にコミットすることが大切です。この手法により、テストの対象範囲を最大化でき、コードの回帰を防止し、継続的デリバリーの土台を築くことができます。

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

DevOpsフレームワークでは、継続的インテグレーションはソフトウェア開発プロセスの最初にあります。DevOpsパイプラインは、従来はそれぞれの独自のサイロに存在していた開発チームとIT運用チームの作業を自動化して組み合わせることで、迅速に高品質のソフトウェアを提供できるようにします。

最良のDevOpsプロセスと文化は、開発業務と運用の垣根を超えて、プラットフォームとインフラストラクチャー業務、セキュリティ、コンプライアンス、ガバナンスリスク管理、基幹業務、エンドユーザー、顧客などにまで及びます。言い換えれば、優れたDevOpsでは、すべてのアプリケーションの利害関係者からの意見をソフトウェア開発ライフサイクルに組み込む必要があります。

DevOpsの一環として、CIを採用すると、開発者は、ローカル・コピーがコード・ビルドのメイン・ブランチとかけ離れすぎないように、少なくとも1日に1回はコードをチェックします。この手法をとっていれば、デリバリーやデプロイのフェーズでビルドが「中断」される、マージ競合の惨事を回避することができます

CI、継続的デリバリー、継続的デプロイメントの比較

継続的インテグレーションはCI/CDパイプラインの最初の段階であり、通常はこのあとに継続的デリバリーと継続的デプロイメントのプロセスが続きます。

継続的デリバリー(CD)は、継続的インテグレーションが中断したところから再開し、開発、テスト、そして最終的にはエンド・ユーザーへのデリバリーに必要なすべての環境へのアプリケーションと検証済みのコード・ベースの変更(更新、バグ修正、さらには新機能)のデリバリーを自動化します。CDプロセスはビルド・フェーズを「グリーン」に保つため、成果物はいつでもデプロイすることが可能です。

継続的デプロイメント(DevOpsの最終フェーズ)では、コードの変更が自動的に本番環境にリリースされ、エンド・ユーザーに配布されます。この時点で、コードの修正はすべてのテスト・プロトコルに合格しており、したがって安全で一般公開の準備が整っています。CIスクリプトやツールは、次にソフトウェアの成果物を公開サーバーや配布プラットフォーム(アプリケーション・ストアなど)に移動し、エンド・ユーザーに更新をプッシュします。

アジャイル開発における継続的インテグレーション

継続的インテグレーションとアジャイル開発には、テストの自動化など多くの共通点があるため、この2つがどのように相互作用するかについて説明するとわかりやすいでしょう。

アジャイルとは、開発プロセスを小さな作業グループ、つまり「スプリント」に編成して、障壁を最小限に抑え、開発者のコラボレーションを可能にし、ソフトウェアの提供を加速する手法です。アジャイル手法では、ソフトウェア開発の実践と顧客のニーズは動的であり、時間の経過とともに変化する可能性があるとされています。

このようにアジャイルでは開発に対して反復的な手法をとるために、チームや企業は変化に適応しやすく、時間の経過とともにソフトウェア・ソリューションを拡張して進化させやすくなっています。また、CIは頻繁な更新とコード検証を奨励するため、アジャイル・チームは高品質の製品をより早く世に送り出すことも可能になり、これが本質的にアジャイルな実践を作り出しています。

継続的インテグレーションのベスト・プラクティス

継続的インテグレーションにより、DevOpsチームはソフトウェアのコーディング、テスト、デプロイ、サポートに共有リポジトリーを活用できるようになりますが、企業におけるプロセスの最適化にはその他にも実行できる手順があります。一般的に実装されるCIのベスト・プラクティスには次のようなものがあります。

単一のソースコード・リポジトリーの維持

コードベースの統合、一元化により、配布と可視化が容易になります。多くの組織では、ソース・コントロール管理を使用して、製品ビルドに関連するすべてのファイルを追跡・管理する単一のリポジトリーを維持しています。

毎日のメインライン・コミットの使用

組織では、開発者に少なくとも1日に1回はメインの開発ストリームに変更をコミットするように求めることで、一貫性のある文化を作り出すことができます。また、これにより、開発者は作業コピーが主要な開発ストリームと一致していることを検証できます。

高速で効率的なビルド・プロセスの維持

ビルド・スクリプトの最適化、タスクの並列化、キャッシュ・メカニズムの使用により、ビルド時間を短縮できます。また、チームはCIパイプラインを設定して、新しいインテグレーションに問題が発生した場合に、プロセスの早い段階で失敗するようにすることもできます。これにより、開発者は問題に迅速に対処し、デバッグに費やす時間を短縮できます

 

 

運用環境のクローンでのテスト

テスト環境を最終的な運用環境に可能な限り似せることで、テスト結果で実際の運用環境におけるソフトウェアの動作内容を正確に表せるようになります。

機能フラグに依存

新機能のリリースを制御する機能フラグを実装すると、CIシステムは運用全体に影響を与えることなく、不完全な機能または実験的な機能をメイン・ブランチにマージできます。

CIパイプラインの頻繁なレビュー

CIパイプラインを定期的にレビューし更新して、新しいツール、テクノロジー、ベスト・プラクティスを組み込むことで、パイプラインをプロジェクトのニーズに合わせて進化させることができます。

継続的インテグレーションのメリット

特にDevOpsやアジャイル開発の一環として堅牢なCIパイプラインを設定するには、適切なツールの選択、ビルドとテストのワークフローの定義、インフラストラクチャーの構成など、慎重な計画と構成が必要です。CIパイプラインでは、コード・ベース、依存関係(APIなど)、インフラストラクチャーの変更に対応するために定期的なメンテナンスも必要です。

ただし、CIを実装すると、ソフトウェア開発チームには次のようなさまざまなメリットがあります。

より早く、効率的なエラー検出

CIプロセスにより、チームは早期に、場合によってはチェックインから数分以内にエラーに対処できます。

チームコラボレーションの向上

チームの全員がコードを変更し、コード変更を統合し、コードの非互換性や統合エラーを特定できるため、簡単に知識が共有でき、同僚間のフィードバックを通じて、コーディングとソフトウェアの品質を向上できます。

ソフトウェア開発を加速

新しいコードを継続的に統合できるため、コードの大規模バッチへの統合とテストに費やすチームの時間を削減できます。また、CIツールが提供するフィードバック・ループの高速化により、開発者はソフトウェアのアップデートや新製品をより迅速に反復してエンド・ユーザーに届けられるようになります。

開発プロセスにおけるリスクの軽減

コードを頻繁にコミットすることで、より小さく段階的な変更ができ、理解や、レビュー、テストが容易になります。これにより、開発中にコード・ベースに重大な問題が持ち込まれるリスクが軽減できます。

関連ソリューション
IBM DevOps ビルド

IBM DevOpsは、ソフトウェア・ビルドを構成および実行するための分散型マルチプラットフォーム・ビルド管理ツールです。

IBM DevOps Buildの詳細はこちら DevOps電子書籍を購入
IBM DevOpsソリューション

強力なDevOpsソフトウェアを活用して、複数のデバイス、環境、クラウドにわたってセキュリティーが強化されたクラウドネイティブ・アプリケーションを開発、デプロイ、管理します。

IBM DevOpsソリューションの詳細はこちら IBM DevOpsソリューションを試してみる
IBM Cloud Continuous Delivery

IBM Cloud Continuous Deliveryにより、チームではエンタープライズ対応のDevOpsを採用して、アプリケーションのデリバリー業務を支援する安全なツールチェーンを作成し、ビルド、テスト、デプロイなどを自動化できます。

IBM Cloud Continuous Deliveryの詳細はこちら IBM Cloud Continuous Deliveryを試してみる
参考情報 DevOpsとは

DevOpsは、ソフトウェア開発チームとIT運用チームの作業を組み合わせて自動化することで、高品質のソフトウェアを迅速に提供できるようにします。

ハイブリッドクラウドのDevOps: IBMの視点

ハイブリッドクラウドのDevOpsが、デジタル改革で組織を成功に導く方法。

CI/CDとCI/CDパイプラインとは

CI/CDパイプラインを理解するための実用的なガイドはこちら。

継続的デリバリーとは

継続的デリバリーは、開発チームがソフトウェアのリリース・プロセスを自動化するために使用する手法です。

デジタル・トランスフォーメーション

デジタル変革は、組織のあらゆる領域にデジタル・テクノロジーを組み込む戦略的な取り組みです。

Java とは何ですか?

Javaは、広く使用されているオブジェクト指向のプログラミング言語およびソフトウェア・プラットフォームです。Javaの規則と構文は、CおよびC++言語に基づいています。

CI/CDおよびCI/CDパイプラインとは

継続的インテグレーション/継続的デリバリー(CI/CD)パイプラインの実践ガイドです。

次のステップ

DevOpsの準備はできていますか? 市場が要求する速度でソフトウェアとサービスを提供するには、チームは迅速に繰り返して実験し、新しいバージョンを頻繁にデプロイし、フィードバックとデータに基づいて推進する必要があります。 最も成功しているクラウド開発チームは、最新のDevOps文化と実践を採用し、クラウドネイティブ・アーキテクチャを採用し、クラス最高のツールからツールチェーンを組み立てて生産性を最大限に引き出しています。

DevOps ソリューションの詳細はこちら 無料評価版