ホーム Topics 継続的インテグレーション| IBM 継続的インテグレーションとは
継続的インテグレーションは、開発者が新しいコードを少なくとも1日に1回、コード・ベースに統合するソフトウェア開発プロセスです。
黒と青の背景画像
継続的インテグレーションとは

継続的インテグレーションとは、開発サイクル全体を通じて、開発者が作成した新規コードをより頻繁に統合し、少なくとも1日に1回はコード・ベースに追加する、ソフトウェア開発プロセスです。 ビルドの各反復に対して自動化されたテストが行われます。これは統合の問題をより早い段階で特定するためであり、修正が容易になるほか、リリースのための最終マージ段階で問題が生じるのを回避する上でも役立ちます。 総じて継続的インテグレーションはビルド・プロセスを合理化し、高品質のソフトウェアと、より予測可能なデリバリー・スケジュールを生み出すことに役立ちます。

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

DevOpsという言葉の原義は、これまでばらばらに業務を遂行していた開発チームとIT運用チームという2つのグループの取り組みを 自動化し統合することで、ソフトウェア開発 プロセスと組織文化の変化の道筋を示し、 高品質なソフトウェアを迅速に提供することです。

実際には、DevOpsのプロセスが最良である場合は、開発と運用の枠を超えて拡張することによって、すべてのアプリケーションの利害関係者(プラットフォームとインフラストラクチャーのエンジニアリング、セキュリティー、コンプライアンス、ガバナンス、リスク管理、基幹業務、エンド・ユーザー、顧客を含む)からのインプットをソフトウェア 開発ライフサイクルに組み込むことができます。 

 DevOps のフレームワークにおいて、継続的インテグレーションはソフトウェア開発プロセスの初期段階に位置します。少なくとも1日に1回はコードのチェックインを行うことで、ローカル・コピーが、コード・ビルドのメインブ・ランチからあまりにかけ離れたものになってしまうことを防ぎます。 これにより、ビルドが「破損」してチームが問題解決に数時間または数日拘束されるような、マージでの致命的な競合を回避できます。

継続的インテグレーションは、継続的デリバリーのテスト、デプロイメント、リリースの各段階の、前提条件としての役割を果たします。 開発チーム全体で、不適切なコードが作成されたかどうかをチェックインの数分以内に把握できます。これは、継続的インテグレーション・サービスによって、コード変更が自動的にビルドされ、エラーがないかがテストされるためです。

継続的インテグレーション(CI)、継続的デリバリー(CD)、継続的デプロイメントの比較

DevOpsのサイクルでは、継続的インテグレーションの後に、継続的デリバリーと継続的デプロイメントが続きます。 

継続的デリバリー (CD)は継続的インテグレーションの拡張と位置付けられ、選択されたインフラストラクチャー環境へのアプリケーションのデリバリーを自動化します。 CDは、コード・ベース(更新、バグ修正、新機能)対する検証済みのあらゆる変更を、ユーザーに可能な限り迅速かつ安全に 配信することに重点を置いています。 これにより、開発環境、テスト環境、実稼働環境など異なる環境へのコード変更のプッシュが確実に自動化されるようになります。

継続的デプロイメントでは、アプリケーションに対するコード変更は、自動的に実稼働環境にリリースされます。 この自動化は、事前定義された一連のテストによって実施されます。 新しい更新がこれらのテストに合格すると、システムは更新をソフトウェアのユーザーに直接プッシュします。

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

継続的インテグレーションについて一般的に挙げられるメリットは、以下の通りです。

  • 早期の、改善されたエラー検出とメトリックにより、エラーの早期解決(場合によってはチェックインから数分以内)が可能

  • 継続的かつ可視化された進展により、フィードバックが改善される

  • チーム・コラボレーションが改善され、すべてのチーム・メンバーがコードの変更、システムの統合、ソフトウェアの他の部分との競合の迅速な特定を行うことができる

  • システム統合が改善され、これによりソフトウェア開発ライフサイクルの終了段階での予期せぬ問題が減少する

  • マージとテストにおける並列変更が減少する

  • システム・テストにおけるエラー数が減少する

  • システムが頻繁に更新されてテスト対象となる
継続的インテグレーションとアジャイル

アジャイルは、ソフトウェア開発チームがどのようにチーム編成を行い、要件変更に適応し、ソフトウェアをリリースするかを改善する、ソフトウェア開発プラクティスです。  継続的インテグレーション(IBM外部へのリンク) と アジャイル開発 は多くの機能(テストの自動化など)が共通しているため、継続的インテグレーションとアジャイルについて同時に取り上げるのは有用と言えます。 アジャイルは、開発を小規模の作業グループまたはスプリントに編成します。 DevOpsにおいて適用した場合、これらの複合的なプラクティスは、ソフトウェアの品質とプロジェクトの柔軟性を確保するのに役立ちます。

継続的インテグレーションでは、頻繁に(多くの場合、1日に何度も)作業を統合する必要があります。 統合エラーを可能な限り早期に検出する自動ビルドによって、統合を検証します。 ビルドには、検証の一環として実行テストを組み込む必要があります。 高速テストを、自動化されたテスト環境でのランタイム・テストに拡張することで、自然に継続的デリバリーへとつながっていきます。

アジャイル(IBM外部へのリンク)  も反復型であり、変更に適応することで、時間の経過に合わせてソリューションを拡張、発展させることができます。 継続的インテグレーションのコンテキストにおいて、アジャイル・ソフトウェア開発とは、継続的に統合を進める中で、機能の価値をどのように優先順位付けするかに基づいて、ソフトウェア開発の反復を実施することを指します。

オープンソースの継続的インテグレーション・ツール

人気のあるオープンソースの継続的な統合ツールには、以下が含まれます。

  • Jenkins:広く使用されているオープンソースの継続的インテグレーション・ツールであるJenkinsにより、開発者はコードをソース・リポジトリーにコミットした後すぐに、そのコードを自動的にビルド、統合、テストできます。そのため、開発者にとって、バグを早期に把握し、ソフトウェアをより迅速にデプロイすることが容易になります。 JenkinsではDockerプラグインを使用できます。

  • Buildbot: Buildbotは、ソフトウェア開発サイクルのあらゆる側面を自動化できます。 ジョブ・スケジューリング・システムとして、ジョブをキューに入れて実行し、結果を報告します。

  • Go:Goが傑出しているのはパイプラインの概念であり、これが複雑なビルド・ワークフローのモデリングを容易にします。

  • Travis CI:最も古く、最も信頼されているホスト型ソリューションの1つであり、エンタープライズ向けのオンプレミス・バージョンでも利用可能です。

  • GitLab CI:オープンソースのRailsプロジェクトの不可欠な部分であるGitLab CIは、無料のホスト型サービスです。アクセス制御、課題追跡、コード・レビューなどの機能を備えた、詳細なGitリポジトリー管理を提供します。

オープンソース・ツールを活用して継続的インテグレーションを実施すると、以下のような多くのメリットがあります。

  • プロジェクトをサポートできる数百ものプラグイン

  • Python、 Java、 JavaScriptなど、オープン・ソース言語を広くサポート

  • コストがかからないため、学生やスタートアップ企業、副業で働く開発者が、予算に優しい強力なツールとして利用可能

  • カスタマイズ可能であるため、開発者はCIツールの基盤を活用しながら、さらにニーズに合わせた構築が可能

  • ツールを変更・再配布する機能

ソフトウェア開発ワークフローで検討すべき、オープンソースの継続的インテグレーション・ツールには、Jenkins、Go、Buildbot、Travis CIなどがあり、これらについては次のセクションでご紹介します。

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

継続的インテグレーション・サーバーは、あらゆる継続的インテグレーション・オペレーションを集中管理し、プロジェクトを構築するための信頼性の高い安定したプラットフォームを提供するソフトウェア・ツールです。 CIサーバーを構成、調整することで、複数の異なるプラットフォーム用にさまざまなプロジェクトを構築できます。 継続的インテグレーション・サーバーは、複雑なワークフローを簡単にモデル化および可視化し(それによって継続的デリバリーを可能にする)、継続的デリバリーのパイプラインを構築するための直感的なインターフェースを提供します。 継続的インテグレーション・サーバーは、以下を行うための機能を提供します。

  • ビルド、テスト、リリースを単一の場所で自動的に実行する

  • 任意のバージョンをいつでもデプロイする

  • 正しい手順に沿った構成を維持する

  • プラグインをサポートして機能性を拡張する

  • プロジェクトのリポジトリーをモニターする

  • 変更をプルし、正常にコミットするために定義したタスクを実行する

  • ビルドの詳細を含むフィードバックを、関連するプロジェクト・メンバーに送信する
継続的インテグレーションのユースケース

以下の架空のユースケースは、2人のソフトウェア開発者が継続的インテグレーションを使用して、DevOpsプロセスをどのように改善できるかを示したものです。

この2人の開発者は、どの機能がどのように作動するかについて、互いに意思疎通を図る必要があります。 この少人数チームは定期的な更新を行う必要があり、コード全体を統合・テストできなくてはなりません。 コード・チェックインのスケジューリングとテストには、多くの開発時間を要します。 継続的インテグレーションのための自動システムが必要となります。

チェックインとテストをいつ実施するかについての交渉は、開発者の多くの時間を消費することになります。 この2人は次のことに同意する必要があります。

  1. コード統合のテストをいつ開始するのか
  2. 統合が成功したことをどのようにテストするのか
  3. 結果をチームにどのように伝達するのか

継続的インテグレーションのプラットフォームでは、これらの質問に対する既定の答えがあります。さらに、そのほとんどで、構成とセットアップが可能となっています。

通常、JenkinsのようなCIプラットフォームは、チェックイン時に統合テストを開始します。 新規コードがチェックインされると、CIシステムは一連のテスト(単体テストと回帰テストを含むこともある)を実行し、コードが正常に統合されたかどうかを判別します。

または、コンパイル済み言語を使用している場合は、コードが正常にコンパイルされるかどうかのデフォルトのテストが行われます。 正常にコンパイルできない場合は、新規コードが原因でビルドは破損したということです。 PythonまたはJavaScriptのような言語の場合は、独自の統合テストを作成する必要があります。

いずれにしても、ほとんどのCIシステムは統合の試行回数、成功率、その他のメトリックをログに記録します。

テストとベスト・プラクティス

テストの重要性

継続的テストは、継続的インテグレーションのビルドとパッケージ(インストール可能エンティティーまたはパッケージ・エンティティーとも呼ばれます)を生成する際に開始されます。 そしてパッケージ・エンティティーが実働状態に入ると終了します。 エンドツーエンドのすべてのステップにテスト・スイートは関与します。

テスト・ステージが1つしかない最低限の場合でも、継続的インテグレーションの30%にテストが含まれます。 実際には、継続的インテグレーション活動の50%から70%はテストで構成されています。 以前は、手動でテストを完了する必要がありました。 現在は自動化されたテストが使用可能となり、それが継続的インテグレーションを成功させる鍵になっています。

継続的インテグレーションに向けたテスト自動化の一環として、テスト駆動開発はコードを繰り返し作成し、一度に1つのユースケースをテストすることでテスト・カバレッジを確保し、コード品質を高め、継続的デリバリーのための基礎を築きます。 自動化されたテストにより、アプリケーションのすべての機能領域で開発されたテストのうち、1つ以上で新規コードが不合格となったかどうかが分かります。 ベスト・プラクティスでは、開発者はローカル環境ですべてまたは一部のテストを実行する必要があります。これにより、新たなコード変更がテストに合格した場合にのみ、開発者によってソースコードがバージョン管理にコミットされるようになります。 経験上、効果的な回帰テストはその後の不測の事態を回避することに役立ちます。

継続的インテグレーション・パイプライン

継続的インテグレーション・パイプラインは、プロジェクトのパイプラインの段階(ビルド、テスト、デプロイメントなど)を反復可能な方法で、人間の介入を最小限に抑えて自動化します。 制御、チェックポイント、スピードを実現する自動化された継続的インテグレーション・パイプラインは、アプリケーションの開発、テスト、デプロイメントを簡素化する上で不可欠になっています。

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

継続的インテグレーション・プロセスは、DevOpsの重要なコンポーネントであり、ソフトウェアのコーディング、テスト、デプロイ、サポートを行うために、共有リポジトリーによって開発チームと運用チームを統合するのを支援します。 以下は、お客様の成功に役立つCIのベスト・プラクティスを示したものです。

  • 単一のソースコード・リポジトリーの維持: ソース制御管理を使用して、製品のビルドに必要なすべてのファイルに対する追跡および制御を行います。 この統合されたコード・ベースにより、配布と可視性の実現が容易になります。

  • ビルドの自動化: これには、ビルド成果物を生成するコンパイル、リンク、および他のプロセスが含まれます。 セルフテストも自動化する必要があります。

  • 日次でのメインライン・コミットの実施: 少なくとも毎日1回は、変更をメイン開発ストリームにコミットするよう開発者に強制します。 各開発者は、それぞれの作業用コピーがメイン開発ストリームと整合していることを確認する必要があります。

  • 複製された実稼働環境でのテスト: テスト環境を、最終的な実稼働環境と可能な限り同じになるようにします。

  • デプロイメントの自動化: ビルドとテストを実行するため、複数の環境(開発、統合、実動)を実装します。
関連ソリューション
IBM UrbanCode Build

IBM UrbanCode Buildツールは、テンプレート駆動型のシステムを使用したエンタープライズ規模のビルド管理ソリューションで、ソフトウェアのビルドをより簡単に構成および実行できます。

IBM UrbanCode Buildの詳細はこちら
参考情報 概要

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

継続的デリバリーについて

継続的デリバリーは、アプリケーションのテスト環境および実稼働環境へのデリバリーを自動化します。

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

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

詳細情報はこちら

DevOpsの準備はできていますか。 市場が求めるスピードでソフトウェアやサービスを提供するには、DevOpsチームはフィードバックとデータに基づいて迅速に反復および実験し、頻繁に新しいバージョンをデプロイする必要があります。 最も成功しているクラウド開発チームは、最新のDevOps文化とプラクティスを採用し、クラウドネイティブなアーキテクチャーを取り入れ、ベスト・イン・クラスのツールからツールチェーンを組み立てることで、生産性を高めています。

DevOpsソリューションの詳細はこちら