継続的インテグレーションとは、開発サイクル全体を通じて、開発者が作成した新規コードをより頻繁に統合し、少なくとも1日に1回はコード・ベースに追加する、ソフトウェア開発プロセスです。 ビルドの各反復に対して自動化されたテストが行われます。これは統合の問題をより早い段階で特定するためであり、修正が容易になるほか、リリースのための最終マージ段階で問題が生じるのを回避する上でも役立ちます。 総じて継続的インテグレーションはビルド・プロセスを合理化し、高品質のソフトウェアと、より予測可能なデリバリー・スケジュールを生み出すことに役立ちます。
DevOpsという言葉の原義は、これまでばらばらに業務を遂行していた開発チームとIT運用チームという2つのグループの取り組みを 自動化し統合することで、ソフトウェア開発 プロセスと組織文化の変化の道筋を示し、 高品質なソフトウェアを迅速に提供することです。
実際には、DevOpsのプロセスが最良である場合は、開発と運用の枠を超えて拡張することによって、すべてのアプリケーションの利害関係者(プラットフォームとインフラストラクチャーのエンジニアリング、セキュリティー、コンプライアンス、ガバナンス、リスク管理、基幹業務、エンド・ユーザー、顧客を含む)からのインプットをソフトウェア 開発ライフサイクルに組み込むことができます。
DevOps のフレームワークにおいて、継続的インテグレーションはソフトウェア開発プロセスの初期段階に位置します。少なくとも1日に1回はコードのチェックインを行うことで、ローカル・コピーが、コード・ビルドのメインブ・ランチからあまりにかけ離れたものになってしまうことを防ぎます。 これにより、ビルドが「破損」してチームが問題解決に数時間または数日拘束されるような、マージでの致命的な競合を回避できます。
継続的インテグレーションは、継続的デリバリーのテスト、デプロイメント、リリースの各段階の、前提条件としての役割を果たします。 開発チーム全体で、不適切なコードが作成されたかどうかをチェックインの数分以内に把握できます。これは、継続的インテグレーション・サービスによって、コード変更が自動的にビルドされ、エラーがないかがテストされるためです。
DevOpsのサイクルでは、継続的インテグレーションの後に、継続的デリバリーと継続的デプロイメントが続きます。
継続的デリバリー (CD)は継続的インテグレーションの拡張と位置付けられ、選択されたインフラストラクチャー環境へのアプリケーションのデリバリーを自動化します。 CDは、コード・ベース(更新、バグ修正、新機能)対する検証済みのあらゆる変更を、ユーザーに可能な限り迅速かつ安全に 配信することに重点を置いています。 これにより、開発環境、テスト環境、実稼働環境など異なる環境へのコード変更のプッシュが確実に自動化されるようになります。
継続的デプロイメントでは、アプリケーションに対するコード変更は、自動的に実稼働環境にリリースされます。 この自動化は、事前定義された一連のテストによって実施されます。 新しい更新がこれらのテストに合格すると、システムは更新をソフトウェアのユーザーに直接プッシュします。
継続的インテグレーションについて一般的に挙げられるメリットは、以下の通りです。
アジャイルは、ソフトウェア開発チームがどのようにチーム編成を行い、要件変更に適応し、ソフトウェアをリリースするかを改善する、ソフトウェア開発プラクティスです。 継続的インテグレーション(IBM外部へのリンク) と アジャイル開発 は多くの機能(テストの自動化など)が共通しているため、継続的インテグレーションとアジャイルについて同時に取り上げるのは有用と言えます。 アジャイルは、開発を小規模の作業グループまたはスプリントに編成します。 DevOpsにおいて適用した場合、これらの複合的なプラクティスは、ソフトウェアの品質とプロジェクトの柔軟性を確保するのに役立ちます。
継続的インテグレーションでは、頻繁に(多くの場合、1日に何度も)作業を統合する必要があります。 統合エラーを可能な限り早期に検出する自動ビルドによって、統合を検証します。 ビルドには、検証の一環として実行テストを組み込む必要があります。 高速テストを、自動化されたテスト環境でのランタイム・テストに拡張することで、自然に継続的デリバリーへとつながっていきます。
アジャイル(IBM外部へのリンク) も反復型であり、変更に適応することで、時間の経過に合わせてソリューションを拡張、発展させることができます。 継続的インテグレーションのコンテキストにおいて、アジャイル・ソフトウェア開発とは、継続的に統合を進める中で、機能の価値をどのように優先順位付けするかに基づいて、ソフトウェア開発の反復を実施することを指します。
人気のあるオープンソースの継続的な統合ツールには、以下が含まれます。
オープンソース・ツールを活用して継続的インテグレーションを実施すると、以下のような多くのメリットがあります。
ソフトウェア開発ワークフローで検討すべき、オープンソースの継続的インテグレーション・ツールには、Jenkins、Go、Buildbot、Travis CIなどがあり、これらについては次のセクションでご紹介します。
継続的インテグレーション・サーバーは、あらゆる継続的インテグレーション・オペレーションを集中管理し、プロジェクトを構築するための信頼性の高い安定したプラットフォームを提供するソフトウェア・ツールです。 CIサーバーを構成、調整することで、複数の異なるプラットフォーム用にさまざまなプロジェクトを構築できます。 継続的インテグレーション・サーバーは、複雑なワークフローを簡単にモデル化および可視化し(それによって継続的デリバリーを可能にする)、継続的デリバリーのパイプラインを構築するための直感的なインターフェースを提供します。 継続的インテグレーション・サーバーは、以下を行うための機能を提供します。
以下の架空のユースケースは、2人のソフトウェア開発者が継続的インテグレーションを使用して、DevOpsプロセスをどのように改善できるかを示したものです。
この2人の開発者は、どの機能がどのように作動するかについて、互いに意思疎通を図る必要があります。 この少人数チームは定期的な更新を行う必要があり、コード全体を統合・テストできなくてはなりません。 コード・チェックインのスケジューリングとテストには、多くの開発時間を要します。 継続的インテグレーションのための自動システムが必要となります。
チェックインとテストをいつ実施するかについての交渉は、開発者の多くの時間を消費することになります。 この2人は次のことに同意する必要があります。
継続的インテグレーションのプラットフォームでは、これらの質問に対する既定の答えがあります。さらに、そのほとんどで、構成とセットアップが可能となっています。
通常、JenkinsのようなCIプラットフォームは、チェックイン時に統合テストを開始します。 新規コードがチェックインされると、CIシステムは一連のテスト(単体テストと回帰テストを含むこともある)を実行し、コードが正常に統合されたかどうかを判別します。
または、コンパイル済み言語を使用している場合は、コードが正常にコンパイルされるかどうかのデフォルトのテストが行われます。 正常にコンパイルできない場合は、新規コードが原因でビルドは破損したということです。 PythonまたはJavaScriptのような言語の場合は、独自の統合テストを作成する必要があります。
いずれにしても、ほとんどのCIシステムは統合の試行回数、成功率、その他のメトリックをログに記録します。
テストの重要性
継続的テストは、継続的インテグレーションのビルドとパッケージ(インストール可能エンティティーまたはパッケージ・エンティティーとも呼ばれます)を生成する際に開始されます。 そしてパッケージ・エンティティーが実働状態に入ると終了します。 エンドツーエンドのすべてのステップにテスト・スイートは関与します。
テスト・ステージが1つしかない最低限の場合でも、継続的インテグレーションの30%にテストが含まれます。 実際には、継続的インテグレーション活動の50%から70%はテストで構成されています。 以前は、手動でテストを完了する必要がありました。 現在は自動化されたテストが使用可能となり、それが継続的インテグレーションを成功させる鍵になっています。
継続的インテグレーションに向けたテスト自動化の一環として、テスト駆動開発はコードを繰り返し作成し、一度に1つのユースケースをテストすることでテスト・カバレッジを確保し、コード品質を高め、継続的デリバリーのための基礎を築きます。 自動化されたテストにより、アプリケーションのすべての機能領域で開発されたテストのうち、1つ以上で新規コードが不合格となったかどうかが分かります。 ベスト・プラクティスでは、開発者はローカル環境ですべてまたは一部のテストを実行する必要があります。これにより、新たなコード変更がテストに合格した場合にのみ、開発者によってソースコードがバージョン管理にコミットされるようになります。 経験上、効果的な回帰テストはその後の不測の事態を回避することに役立ちます。
継続的インテグレーション・パイプライン
継続的インテグレーション・パイプラインは、プロジェクトのパイプラインの段階(ビルド、テスト、デプロイメントなど)を反復可能な方法で、人間の介入を最小限に抑えて自動化します。 制御、チェックポイント、スピードを実現する自動化された継続的インテグレーション・パイプラインは、アプリケーションの開発、テスト、デプロイメントを簡素化する上で不可欠になっています。
継続的インテグレーションのベスト・プラクティス
継続的インテグレーション・プロセスは、DevOpsの重要なコンポーネントであり、ソフトウェアのコーディング、テスト、デプロイ、サポートを行うために、共有リポジトリーによって開発チームと運用チームを統合するのを支援します。 以下は、お客様の成功に役立つCIのベスト・プラクティスを示したものです。