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

CI/CD(継続的インテグレーション、継続的デリバリー/デプロイメント)パイプラインとは、ソフトウェア デリバリーにおけるコード作成から導入までの一連のステップです。DevOpsの基盤となるCI/CDは、反復タスクの自動化を通してアプリケーション開発を合理化することで、早期にバグを検出し、人的ミスを削減し、ソフトウェア デリバリーを高速化します。

CI/CDパイプラインの解説

CI/CDでは、コード開発から本番環境への導入までの一連のプロセスを自動化することで、頻繁に信頼できる方法でコード変更を本番環境にデリバリーできるようにします。DevOpsは、開発チームと運用チームのコラボレーションを重視し、ソフトウェアの品質を損なうことなく最終的に開発ライフサイクルを短縮する新しい形のソフトウェア開発ですが、CI/CDはそのバックボーンを形成します。

DevOpsの基本原則を具体化したCI/CDパイプラインは、開発、テスト、および運用の間のギャップを埋めます。このコラボレーション環境で、CI/CDは、製品の品質とタイムリーなデリバリーに対する共同責任の文化を促進します。

Various steps in the CI/CD pipeline

図1: CI/CDパイプラインの多様なステップ

継続的インテグレーション(CI)

継続的インテグレーション(CI)は、開発者が定期的にコード変更を中央リポジトリにマージするソフトウェア開発の手法です。マージのたびに自動化されたビルド プロセスとテスト プロセスが実行されるため、エラーを発生させることなく、確実に新しいコードと既存のコードベースが統合されます。開発サイクルの最後に変更をマージすることは、従来は難しい作業でしたが、CIはそれを最小化します。

継続的デリバリー/デプロイメント(CD)

継続的デリバリーと継続的デプロイメントは、どちらも略語はCDであり、CIに続く段階を扱います。継続的デリバリーは、リリース プロセスを自動化し、ソフトウェアの任意のバージョンをいつでも本番環境に導入できる状態を維持するものです。ソフトウェアは常に変更されますが、それを導入可能な状態に保ちます。継続的デプロイメントはさらに進化して、自動テストに合格したすべての変更を自動的に本番環境に導入し、リード タイムを最短にします。

継続的デリバリーと継続的デプロイメントはどちらも、事前定義されたインフラストラクチャ設定を使用して、ステージング環境、本番環境など、多様な環境にアプリケーションを自動的に導入する処理を伴います。CDパイプラインは、統合テスト、パフォーマンス テスト、セキュリティ評価など、追加のテストを組み込んで、アプリケーションの品質と信頼性を保証します。

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

継続的デリバリーと継続的デプロイメントの主な違いは、変更を本番環境に移行する最終ステップにあります。継続的デリバリーでは、導入の最終ステップは手動プロセスであり、自動テストで見落とされる可能性がある潜在的な問題を捕捉するセーフティ ネットを用意しています。一方、継続的デプロイメントは、本番環境への最終的な導入を含めて、パイプライン全体を自動化するため、問題を特定して修正するために厳密なテストと設定の監視を行う必要があります。

言い換えると、CI/CDは、以下の2つのアプローチの一方を指します。

  1. 継続的インテグレーションと継続的デリバリー(CI/CD)
  2. 継続的インテグレーションと継続的デプロイメント(CI/CD)

組織は、CI/CDパイプラインを導入することで、市場投入までの期間の短縮、継続的フィードバック ループの構築、およびソフトウェア品質の向上を達成できます。CI/CDは、開発チーム、運用チーム、およびセキュリティ チームの連携を促進して、安全で安定した高性能なアプリケーションのデリバリーを可能にします。

パイプラインにおけるCI/CDのステップ分割

図2: パイプラインにおけるCI/CDのステップ分割

CI/CDの仕組み: パイプラインの1日

開発者が1杯のコーヒーを飲むところから、CI/CDパイプラインの1日が始まります。気分が落ち着いた後、Gitバージョン管理システムから最新のコードをプルします。最新の変更を確認し、その日の作業を開始します。すなわち、新機能を作成し、バグを修正します。

作業が完了した後、変更を共有リポジトリにコミットします。これで、CI/CDパイプラインが作動し始めます。Webhookが設定されたパイプラインは、コミットを検出し、ビルド段階をトリガーします。Jenkins、CircleCIなどのツールを使用して、ソース コードをコンパイルし、実行可能ファイルを生成します。たとえば、コードベースがJavaアプリケーションである場合、MavenまたはGradleによるビルドを実行します。

次に、パイプラインは、アプリケーションをパッケージ化して、導入可能なアーティファクトを生成します。Webアプリケーションの場合、Dockerイメージを作成します。次に、このイメージを、Docker Hub、AWS ECRでホストされているプライベート レジストリ、Google Container RegistryなどのDockerレジストリにプッシュします。

ビルドが完了すると、パイプラインはテスト段階に移行し、テスト環境を迅速に構築します。通常は、Kubernetesのようなコンテナ オーケストレーション ツールを使用します。この環境にアプリケーションを導入し、一連の自動テストを実行します。このテストには、JUnitで実行するユニット テスト、Postmanなどのツールで実行する統合テスト、およびSeleniumで実行するエンドツーエンド テストを含めることができます。

テストに合格した場合、パイプラインは導入段階に進んで、テスト環境を破棄し、本番環境を構築します。次にアプリケーションをこの環境に導入します。通常はブルー/グリーンデプロイメント戦略を使用して、ダウンタイムを最小限に抑えて、必要なときに速やかにロールバックできるようにします。

継続的インテグレーション、継続的デリバリー/デプロイメント パイプラインの周期的性質

図3: 継続的インテグレーション、継続的デリバリー/デプロイメント パイプラインの周期的性質

1日を通して、新しいコミットのたびに、パイプラインは上記のプロセスを繰り返します。また、Flyway、Liquibaseなどのツールを使用したデータベース移行管理、SonarQubeによる静的コード分析、さらにはトラフィック パターンに基づく本番環境の自動スケーリングも処理します。

さらに、パイプラインは、開発チームにリアルタイムにフィードバックを提供します。ビルド結果の通知をSlackチャンネルに送信し、失敗したビルドの場合はJiraでチケットを作成し、パイプラインのパフォーマンスに関するリアルタイムの指標をダッシュボードで更新します。

1日が終わると、CI/CDパイプラインは、次のコミットを処理する準備ができており、引き続き速いペースで高品質ソフトウェアをデリバリーするという使命を果たします。パイプラインの1日は繰り返しかもしれませんが、繰り返すたびにチームはユーザーに価値を提供するという目標に近づいています。

CI/CDパイプラインの段階

テクノロジ主導のプロセスであるCI/CDは、バージョン管理システム、ビルド サーバ、他の開発ツールなどと統合されています。標準的なパイプラインは複数の段階で構成され、各段階はコードを多様な角度から検証し、導入する準備ができていることを確認するように設計されています。

開発者がコードをバージョン管理リポジトリにコミットすると、パイプラインはすぐに動作を開始して、ソース、ビルド、テスト、および導入の各段階を自動化します。

ソース段階

ソース段階では、バージョン管理システムを使用します。開発者は、コード変更をバージョン管理システムにコミットします。CI/CDパイプラインは、このリポジトリを監視し、新しいコミットを検出すると、次の段階をトリガーします。人気のあるバージョン管理システムとして、Git、Mercurial、Subversionがあります。

ビルド段階

ビルド段階では、CI/CDパイプラインは、ソース コードをコンパイルして実行可能なアーティファクトを作成します。ビルド段階で、コードをパッケージ化して、Dockerコンテナまたは導入に適した別の形式にすることもあります。ビルド プロセスは、信頼性を持たせるために、反復可能で一貫性を備えている必要があります。

テスト段階

CI/CDパイプラインのテスト段階では、ビルドされたアーティファクトに対して一連の自動テストを実行します。テストには、ユニット テスト、統合テスト、およびエンドツーエンド テストを含めることができます。テストの自動化は、この段階で問題を速やかに特定して修正するために重要です。

導入段階

導入段階は、CI/CDパイプラインの最終段階です。継続的デリバリーが設定されている場合、導入段階ではリリースの手動導入を準備します。継続的デプロイメントが設定されている場合、パイプラインは自動的にリリースを本番環境に導入します。

CI/CDパイプラインの種類

単純なプログラムのCI/CDパイプラインには、通常はソース、ビルド、テスト、導入などの段階が含まれます。開発者は、Gitのようなバージョン管理システムにコードをコミットします。パイプラインは、ビルド プロセスをトリガーし、コードをコンパイルして、アーティファクトを作成します。品質保証のために、これらのアーティファクトに対して自動テストを実行します。テストに合格した場合、パイプラインはアーティファクトを本番環境に導入します。Jenkins、CircleCI、GitLab CI/CDなどのツールで、このプロセスをオーケストレーションできます。

クラウドネイティブなCI/CDパイプライン

クラウドネイティブなCI/CDパイプラインは、マイクロサービスに固有のモジュール性を利用して、独立した開発と導入を推進します。各マイクロサービスに固有のパイプラインが存在し、隔離したテスト、ビルド、および導入を実行できるため、連鎖的な失敗のリスクが減少し、提供のスピードが向上します。

マイクロサービスベースのパイプラインのセキュリティは、複数のレベルで適用されます。その中の1つに、各マイクロサービスを独自の権限と制御を備えた潜在的セキュリティ境界として扱うことが含まれます。イメージ スキャン、ランタイム保護などのコンテナ セキュリティ対策に従うことで、マイクロサービスの完全性を保護します。

Istio、Linkerdなどのサービス メッシュは、一般的なクラウドネイティブなパイプライン テクノロジです。サービス間通信で相互TLSやそれと同様の機能を実現することで、マイクロサービスを保護、接続、および監視する統一された方法を提供します。

クラウドネイティブなCI/CDパイプラインは、コード リポジトリ、ビルド サーバ、および導入ターゲットとして、クラウドベースのツールを活用します。たとえば、AWSのパイプラインは、ソース管理にCodeCommit、ビルドとテストにCodeBuild、導入にCodeDeployを使用できます。AWSのパイプラインは、オンデマンドで拡大すること、クラウドネイティブな機能と統合すること、および従量課金制の価格を提供することができます。

Kubernetesネイティブなパイプライン

Kubernetesの拡張可能なアーキテクチャは、CI/CDの原則と一致しており、急速で信頼できるアプリケーション デリバリーをサポートします。Kubernetesネイティブなパイプラインは、Kubernetesクラスタ内で直接動作し、その機能を利用してコンテナ化されたアプリケーションをオーケストレーション、スケーリング、および管理します。コンテナ化されたアプリケーションを複数のクラスタにまたがって導入すること、ロールバックを扱うこと、およびサービス検出を管理することができます。パイプラインのビルド、テスト、導入などの各段階は、Kubernetesのジョブまたはポッドとして実行され、分離とリソース制御を実現します。

Kubernetesネイティブなパイプラインのセキュリティには、Kubernetes固有の対策が含まれます。ロールベースのアクセス制御(RBAC)を使用して、パイプラインの権限を制限し、潜在的なセキュリティ問題の影響範囲を縮小します。ポッドのセキュリティ ポリシーは、パイプラインの各段階を実行するコンテナの機能を制限して、セキュリティ体制を強化できます。

Jenkins X、Tekton、Argo CDのようなCI/CDツールは、Kubernetesネイティブなパイプライン向けに設計されています。GitOpsを使用した環境のプロモーション、プル リクエスト用のプレビュー環境などの機能を提供します。

モノレポ向けCI/CDパイプライン

モノレポは、複数の論理プロジェクトを含む単一リポジトリです。モノレポ向けCI/CDパイプラインは、複数のプロジェクトにわたる変更を効率的に処理する必要があります。リポジトリ全体ではなく、コミットの影響を受けるプロジェクトのみのビルドとテストを実行する必要があります。

Bazel、GoogleのCloud Buildのような高度なCI/CDツールを使用すると、コードベースの依存関係グラフを作成して、コードベースの中で変更したコードに依存する部分のみのビルドとテストを再実行できます。

モノレポ向けCI/CDパイプラインのセキュリティは、変更が他のコンポーネントに影響するのを防ぎます。自動コードと静的コード分析は、パイプラインの早期段階で潜在的なセキュリティ問題を特定します。モノレポの完全性を維持するために、コード レビューを精力的に実施する必要があります。

クラウド上のCI/CD

クラウド プラットフォームは、無限の拡張性、高可用性、本来備わっている災害復旧メカニズムなど、CI/CDパイプラインを導入するための強力な機能を提供します。

クラウド リソースの弾力性は、ワークロードに基づくCI/CDの動的な拡張をサポートし、効率とコストの最適化を促進します。クラウド上のCI/CDは、さらに分散開発チームをサポートし、コラボレーションを強化して、グローバルなソフトウェア開発アプローチを支援します。

AWSでのCI/CD

Amazon Web Services (AWS)は、CI/CDパイプラインを導入するためのツール スイートを提供します。AWS CodeCommitは、フルマネージド ソース管理サービスです。安全なGitリポジトリをホストして、共同で行うコーディングとバージョン管理を促進します。

AWS CodeBuildは、マネージド ビルド サービスです。ソース コードをコンパイルし、テストを実行し、すぐに導入できるソフトウェア パッケージを生産します。AWS CodePipelineは、継続的インテグレーションと継続的デリバリー サービスです。ソース コードから導入までのワークフローのオーケストレーションを実行し、ソフトウェア リリース プロセスをモデル化、可視化、および自動化します。

AWS CodeDeployは、自動導入サービスです。Amazon EC2、AWS Lambda、Amazon ECSのような多様なAWSサービスへのアプリケーション導入を促進します。また、AWSは、人気のあるオープンソース ツールと統合し、柔軟で包括的なCI/CDソリューションを提供します。

AzureでのCI/CD

Azure Pipelinesは、継続的インテグレーションと継続的デリバリーの両方をサポートするクラウド サービスです。任意の言語およびプラットフォームと互換性があるため、多様な開発環境に合わせた多目的ソリューションを提供します。

Azure Reposは、クラウドでホスティングされるプライベートGitリポジトリを無制限に提供し、複数のチームのコラボレーションと効果的なコード管理を可能にします。Azure Test Plansは、テスト作業を管理、追跡、および計画する包括的なソリューションです。高品質なソフトウェアのデリバリーを保証します。

Azureは、さらに幅広い拡張機能や有名なオープンソース ツールとの統合を提供し、CI/CDプラットフォームとしてのその機能を強化しています。

Google CloudでのCI/CD

Cloud Build for CI/CDは、Google Cloud Platform (GCP)で提供されるサーバレス製品です。開発者は、クラウドでソフトウェアをビルド、テスト、および導入できます。Cloud Buildでは、VM、サーバレス、Kubernetes、Firebaseなど、複数の環境にわたってビルド、テスト、および導入するためのカスタム ワークフローを定義できます。

Google Cloud Source Repositoriesは、チームが1か所でコードの保存、管理、追跡を行うための場所です。安全でスケーラブルな高可用性Gitリポジトリを提供します。また、GCPは、Git、Jenkins、Spinnakerのような人気のあるオープンソース ツールと統合しており、柔軟でカスタマイズ可能なCI/CDソリューションを提供します。

IBM CloudでのCI/CD

IBM Cloudは、CI/CDパイプラインを導入するための一連の包括的なツールを提供します。IBM Cloud Continuous Deliveryサービスは、オープン ツールが統合され、アプリケーションのビルド、導入、および管理を自動化するテンプレートが含まれる、ツールチェーンを提供します。

IBM Cloud Code Engineは、フルマネージド サーバレス プラットフォームです。Webアプリ、マイクロサービス、イベント駆動型機能、バッチ ジョブなどのコンテナ化されたワークロードを実行します。また、IBM Cloudは、Git、Jenkins、Tektonのような人気のあるオープンソース ツールと統合しており、CI/CDを導入するための多目的な選択肢になります。

CI/CDパイプラインのベストプラクティス

DevOpsワークフローとソフトウェア デリバリーを強化するために、開発ライフサイクルに以下に示すベストプラクティスを組み込みます。

単一ソース リポジトリ

単一ソース リポジトリを使用することでソース コード管理(SCM)システムとして機能し、ビルドを作成するために必要なすべてのファイルとスクリプトを一元的に保管します。このリポジトリには、ソース コード、データベース構造、ライブラリからプロパティ ファイル、バージョン管理まで、すべてを含める必要があります。また、テスト スクリプトや、アプリケーションをビルドするためのスクリプトも保管する必要があります。

単一ソース リポジトリから作業することで、コラボレーションの強化、バージョン管理の簡素化、競合するリスクの軽減がもたらされ、変更を追跡しやすくなります。

ビルドは1回のみ

コードをコンパイルしてビルド アーティファクトを作成するのは1回だけで、それ以降はこのアーティファクトをパイプラインを通してプロモーションします。この手法は、すべての段階でコードをビルドする場合に発生する可能性がある不一致を防ぐことで、一貫性を高めます。

ビルド プロセスを自動化する

自動ビルドの手法、またはコードを導入可能なアーティファクトに変換することは、人的ミスを減らして、開発プロセスのスピードを向上させます。ビルド スクリプトは、Webサーバ ファイル、データベース スクリプト、アプリケーション ソフトウェアなど、すべてを1つのコマンドでビルドできる包括的なものにする必要があります。CIプロセスは、コードを自動的にパッケージ化してコンパイルし、使用可能なアプリケーションを生成する必要があります。

自動化作業の優先順位を設定する

コードの統合、テスト、導入からインフラストラクチャのプロビジョニング、設定まで、できる限り自動化します。自動化は、効率を向上させると同時に、再現性を保証します。開発者がコードを共有リポジトリにプッシュすると、CIサーバは自動的にビルドアンドテスト プロセスを起動し、問題があればその場で明確にします。このプロセスにより、手動で統合する場合にかかっていた時間と作業が大幅に削減されるため、開発者はコードの強化に集中できます。

早期段階で多数のテストを実施する

パイプラインの早期段階に自動テストを組み込みます。ビルド段階の後にユニット テストを実行し、その後に統合テストとエンドツーエンド テストを実行します。コードがテストに不合格だった場合は失敗したビルドを生成するように、テスト スクリプトを設計します。

複製したテスト環境を使用する

新しいコードを稼働中の本番環境でテストするのではなく、本番環境を複製した環境でテストを実施します。この複製した環境で厳格なテスト スクリプトを使用して、事前構築された初期テスト プロセスで見逃された可能性があるバグを検出および特定します。

頻繁に導入する

頻繁に導入することで、変更のバッチ サイズを縮小し、問題を特定および修正しやすくします。また、フィードバックが早くなり、ロールバックしやすくなり、ユーザーに価値を提供するまでの時間を短縮します。

導入にはCI/CDパイプラインのみを使用する

本番環境に手動で導入するのを禁止します。すべての変更がテストされ、一貫性があり、追跡可能であることを保証するために、すべての変更をパイプライン経由で処理する必要があります。

可視性を要求する

開発チームは、最新の実行可能ファイルにアクセスできるだけでなく、リポジトリに対するすべての変更を確認できる必要があります。開発者が最新バージョンを把握できるように、バージョン管理を使用してハンドオフを管理する必要があります。

フィードバック ループを最適化する

パイプラインが迅速かつ役に立つフィードバックを提供できるようにします。開発者は、その変更がビルドを破損した場合またはテストに不合格だった場合、即座に通知を受け取る必要があります。迅速なフィードバックは、迅速な修正を可能にし、パイプラインの流れを維持します。

リリースのたびに環境をクリーンアップする

各リリース後のテスト環境とステージング環境のクリーンアップを自動化することで、リソースを節約し、各導入環境をクリーンな状態から開始できます。

CI/CDパイプラインのKPI

サイクル時間または導入時間

サイクル時間は、導入時間とも呼ばれ、コードのコミットから本番環境導入までの所要時間を測定します。CI/CDパイプラインの効率を表す重要な指標です。サイクル時間が短いほど、ユーザーに早く価値を提供でき、開発者に早くフィードバックできます。

開発頻度

開発頻度とは、コード変更をバージョン管理システムにコミットする頻度を指します。開発頻度が高いことは、小規模で管理しやすい変更に関連する開発プロセスが活発に行われ、エラーのリスクを軽減していることを示します。

変更リード タイム

変更リード タイムは、変更がコミットされてから導入されるまでの期間を測定する、CI/CDパイプラインの速度の指標です。リード タイムが短いほど、価値が早く実現し、フィードバック ループが高速化します。

変更障害率

変更障害率は、本番環境で失敗する変更の割合です。変更障害率が低いことは、ソフトウェア デリバリー プロセスが高品質であることを示します。テスト品質、コード レビュー手法、および導入手法が変更障害率に影響を及ぼします。

MTTRとMTTFの比較

平均修復時間(MTTR)と平均故障時間(MTTF)には、CI/CDの信頼度が反映されます。MTTRは、故障から回復するまでの平均時間を測定します。MTTFは、故障と故障の間の平均時間を測定します。MTTRが低く、MTTFが高いほど、パイプラインの信頼度が高いことを示します。

動画1: 新しいテクノロジとDevOpsを使用する最新の手法への移行

CI/CDツール

継続的インテグレーション ツール

Codefresh

Codefreshは、Kubernetes向けに設計されたCI/CDプラットフォームです。アプリケーション開発のコミットから導入まで、ライフサイクル全体をサポートします。独特なDockerネイティブなインフラストラクチャで高速で分離されたビルドを可能にし、コンテナ化されたアプリケーションの開発、テスト、および導入のための多目的な環境を提供します。

Bitbucket Pipelines

Bitbucket Pipelinesは、Bitbucketに組み込まれた統合CI/CDサービスです。開発チームは、リポジトリの設定ファイルに基づいて、自動的にコードをビルド、テスト、および導入できます。BitbucketおよびAtlassianのツール スイートと緊密に統合されているため、Atlassianのエコシステムにすでに組み込まれているチームのワークフローを大幅に向上させることができます。

Jenkins

Jenkinsは、オープンソースのオートメーション サーバです。開発者は、信頼できる方法でソフトウェアをビルド、テスト、および導入できます。広範なプラグイン サポートと分散ビルドを提供する、複雑なCI/CDパイプライン向けの柔軟性の高いツールです。

CircleCI

CircleCIは、最新の継続的インテグレーションおよびデリバリー プラットフォームです。ソフトウェアの迅速な開発とリリースをサポートします。シンプルさと効率に重点を置いて、スマートな自動キャッシュ、並列処理、およびジョブ オーケストレーションを提供し、ソフトウェア デリバリー プロセスを最適化します。

Bamboo

BambooもAtlassianスイートに含まれるツールです。継続的インテグレーションおよびデリバリー機能を提供し、GitやJIRAとのソフトウェア統合が組み込まれています。Jenkinsほどの拡張性はありませんが、その機能はすぐに使用できるため、迅速でシンプルな導入を必要とする開発チームにとってわかりやすい設定を提供します。

GitLab CI

GitLab CIは、GitLabに不可欠な部分であり、DevOpsライフサイクル全体をサポートする堅牢なソリューションです。パイプライン設定に柔軟性があり、GitLabのソース管理および問題追跡と緊密に統合されているGitLab CIは、ソフトウェアの開発と導入のためのオールインワンのソリューションを提供します。

継続的デリバリー/デプロイメント ツール

Codefresh

Codefreshは、CI機能を提供するだけでなく、継続的デリバリーもサポートします。その環境分離とHelmチャートのサポートにより、Kubernetesアプリケーションを効率的に信頼できる方法で配信できます。

Argo CD

Argo CDは、Kubernetes向けの宣言型GitOps継続的デリバリー ツールです。アプリケーションを定義する場合の信頼できる唯一の情報源としてGitリポジトリを使用し、リポジトリで変更が検出された場合は自動的にアプリケーションを同期します。

GoCD

GoCDは、継続的デリバリーのための複雑なワークフローのモデル化と可視化に特化したオープンソース ツールです。バリュー ストリーム マップは、コミットから導入までの経路全体を可視化し、ソフトウェア デリバリー プロセスに対する理解を深め、制御しやすくします。

AWS CodePipeline

AWS CodePipelineは、フルマネージド継続的デリバリー サービスです。迅速で信頼できるアプリケーション更新をリリースするパイプラインを自動化します。AWSスイートの一部として他のAWSサービスとシームレスに統合されているため、AWSエコシステム内でリリース プロセス全体を効果的に管理および自動化できます。

Azure Pipelines

Azure Pipelinesは、MicrosoftのAzure DevOpsサービスに含まれるクラウド サービスです。あらゆる言語とプラットフォームのアプリケーション向けにCI/CD機能を提供します。開発分野で最も広く使用されているツールやサービスと連携できる幅広い統合機能およびオープンソース プロジェクトを無料で時間無制限でビルドできることで知られています。

Spinnaker

Spinnakerは、元々Netflixが開発したマルチクラウド継続的デリバリー プラットフォームです。多様なクラウド プロバイダにわたる高い設定可能性と強力なデプロイメント機能を提供します。導入に重点を置いて、ブルー/グリーン、カナリア リリースなど、多様な戦略をサポートし、デリバリー プロセスに対する高度な制御機能を提供します。

機械学習CI/CDアプリケーション

MLOps

機械学習と運用が複合したMLOpsは、機械学習モデルの開発と導入のライフサイクルを標準化および合理化するように設計されています。CI/CD原則を適用して、機械学習モデルのテスト、導入、および監視を自動化し、信頼できる一貫したデリバリーを促進します。

合成データ生成手法

機械学習開発において、合成データ生成は、実データを模倣するデータを作成する手法です。このアプローチは、CI/CDパイプライン内で、モデルのパフォーマンスと網羅性を評価するためのスケーラブルでプライバシーを順守する手法を提供するため、機械学習モデルをテストする際に役立ちます。

AIOpsプラットフォーム

AIOps (Artificial Intelligence for IT Operations)は、AIと機械学習テクノロジをIT運用に統合します。CI/CDのコンテキストにおいて、AIOpsは、異常検出、イベント相関、根本原因分析など、多数の運用タスクを自動化および強化して、ソフトウェア デリバリーの効率と有効性を向上させます。

CI/CDのセキュリティ

CI/CDの速度と自動化は、以下のような新しいセキュリティ リスクをもたらします。

  • 機密データの露出
  • 安全でないサードパーティ コンポーネントの使用
  • CI/CDツールが正しく保護されていない場合の不正アクセス

しかし、パイプライン全体にセキュリティの手法とツールを統合してCI/CDセキュリティを優先すること(DevSecOpsとして知られる手法)により、デリバリーするソフトウェアが機能し、安全であることを保証できます。

安全なコーディング手法

開発者は、コードベースにセキュリティの脆弱性を持ち込むのを防ぐために、安全なコーディング手法を維持する必要があります。優先すべき手法には、入力検証、正しいエラー処理、最小権限の原則などがあります。

セキュリティ テスト

自動化したセキュリティ テストをCI/CDパイプラインに統合します。静的コード分析、動的分析、侵入テストなどのテストは、アプリケーションを導入する前にセキュリティの脆弱性を特定するのに役立ちます。

導入のセキュリティ

導入プロセスに対策を施します。データ転送に安全なプロトコルを使用し、導入プロセス中の権限とアクセス制御を管理し、本番環境でアプリケーションを監視してセキュリティ インシデントを検出します。

安全なCI/CDパイプライン アーキテクチャ

安全なCI/CDパイプライン アーキテクチャは、パイプラインの各段階にセキュリティ制御を統合しています。ソース管理に安全なリポジトリを使用し、ビルド プロセス中にセキュリティ チェックを実施し、自動セキュリティ テストを実行し、安全な導入手法を実施します。

Infrastructure as Codeのセキュリティ

Infrastructure as code (IaC)は、DevOpsの重要な手法であり、機械処理可能な定義ファイルからコンピューティング インフラストラクチャを管理およびプロビジョニングします。IaCのセキュリティには、これらの定義ファイルおよびそこから作成されるインフラストラクチャを管理することが含まれます。機密データを暗号化し、IaCファイルへのアクセスを制限し、定期的にインフラストラクチャのセキュリティ コンプライアンスを監査します。

今後のCI/CDの動向

マイクロサービスとサーバレス アーキテクチャ

マイクロサービスとサーバレス アーキテクチャを採用する組織が増えており、CI/CDパイプラインは複雑化する導入を管理するために適応する必要があります。これには、使用するテクノロジと導入プラットフォームが異なる可能性がある複数の独立したサービスを導入および管理することが含まれます。

人工知能と機械学習

CI/CDパイプラインを最適化するために、AIとMLが使用されることが増えています。CI/CDでのAIとMLの適用例として、潜在的な問題の予測と防止、リソース使用の最適化、複雑化するタスクの自動化などがあります。

Infrastructure as Code (IaC)

IaCは、DevOpsの標準的な手法になりつつあります。IaCのツールと手法が成熟するのに伴い、CI/CDパイプラインにおけるそれらの役割もますます重要になっています。

CI/CDパイプラインについてのFAQ

設定管理とは、製品の寿命を通じて、製品のパフォーマンス、機能、および物理的属性と製品の要件、設計、および運用情報との整合性を確立して維持するためのシステム エンジニアリング プロセスです。ソフトウェア開発のコンテキストでは、設定管理は、開発プロセス中にドキュメント、コード、および他のエンティティの変更を体系的に管理、整理、および制御することを含みます。
CI/CDにおけるパイプラインのオーケストレーションとは、コードがコミットされてから導入されるまでの一連の作業を自動化および管理するプロセスを指します。オーケストレーションの目的は、以下の方法で効率と信頼性を向上させることです。
  • 上記のプロセスを合理化する
  • 上記のプロセスを確実に正しい順序で実行する
  • 作業間の依存関係を処理する

Jenkins、CircleCI、およびBambooは、パイプラインのオーケストレーションで広く使用されているCI/CDツールです。Kubernetesもこの目的で、特にマイクロサービス アーキテクチャで、使用されることが増えています。

アーティファクト リポジトリは、ソフトウェア開発プロセス中に生成されるバイナリおよび他のソフトウェア アーティファクトのストレージです。コンパイル済みコード、ライブラリ、モジュール、サーバ イメージ、コンテナ イメージなどを保存できます。JFrog Artifactory、Sonatype Nexusなどのアーティファクト リポジトリは、バージョン管理、メタデータなどの機能を備えており、アーティファクトを簡単に保存、取得、および管理できます。
バージョン管理は、ファイルまたは一連のファイルに対する変更を時系列に記録して、後で特定のバージョンを呼び出せるようにするシステムであり、ソース管理とも呼ばれます。選択したファイルを前の状態に戻すこと、プロジェクト全体を前の状態に戻すこと、異なる時点の変更を比較すること、および問題の原因となっている可能性があるものを最後に変更したユーザーを確認することなどができます。
CI/CDで信頼できる単一の情報源を維持することは、全員が確定的なバージョンとみなす情報を1つ保持することを意味します。通常は、Gitなどのバージョン管理システムのコードベースを指します。信頼できる単一の情報源は、開発チームと運用チームのメンバーが同一データで作業することを保証して、不一致や競合を減らします。信頼できる単一の情報源は、ソフトウェアをビルド、テスト、および導入するための信頼できる基盤を提供します。
パイプラインベースのアクセス制御 は、CI/CDパイプラインを操作できるユーザーとその方法を規制するセキュリティ対策です。パイプラインをトリガーできるユーザー、その設定を変更できるユーザー、またはビルド結果にアクセスできるユーザーを制限できます。これらの制御は、開発と導入のプロセスの完全性を維持し、不正な変更を防ぎ、セキュリティ ポリシーの順守を維持するために極めて重要です。
CI/CDのブランチ戦略には、機能ブランチ(新機能を個別のブランチで開発した後にメイン ブランチにマージする)、トランクベース開発(開発者が単一のブランチで短期間の機能ブランチを作成する)、Gitflow (開発、ステージング、および本番環境用に個別のブランチを使用し、それぞれがCI/CDパイプラインの異なる段階に対応する)などがあります。
トランクベース開発は、すべての開発者が、「メイン」または「トランク」と呼ばれる単一ブランチで作業するソフトウェア開発手法です。開発者は、頻繁に(通常は1日1回)このメイン ブランチに変更を統合することで、統合を促進し、マージの複雑さを軽減します。
ua-parser-jsは、軽量のJavaScriptライブラリであり、User-Agentデータからブラウザ、エンジン、OS、CPU、およびデバイスのタイプとモデルを検出します。ユーザーの環境に基づいて異なるWebページやリソースを提供する場合またはユーザーのブラウザとデバイスを理解することがユーザー エクスペリエンスの向上または有用な指標の提供につながる状況において、分析の役に立ちます。
継続的デリバリー成熟度モデルは、継続的デリバリー手法の導入における習熟度と成熟度を評価するのに役立つフレームワークです。通常は、初期、管理、最適化の複数のレベルがあり、各レベルに固有のベストプラクティスと機能があります。このモデルは、改善可能な領域を特定し、手法の成熟度を高める計画を立てる際の指針を示します。
バージョン管理システムのコンテキストでは、コードのコミットとは、コードベースに対する変更をリポジトリに保存するアクションです。各コミットは、コードに対する個別の変更を表し、通常は変更を説明するメッセージを伴います。コミットによって変更履歴が作成されるため、開発者は進捗を追跡し、変更について理解し、必要に応じて元に戻すことができます。
パイプライン実行は、CI/CDパイプラインで定義されているすべての作業を実行するプロセスを指します。通常は、コードのコミットまたはスケジュールされたイベントによって起動されます。パイプライン設定に応じて、ビルド、テスト、導入のような段階を順番に、または並行して実行します。この実行は、作業の流れとして可視化できます。各作業は、前の作業の正常完了に依存するため、コードが導入可能であることが保証されます。
コード カバレッジは、特定のテスト スイートの実行時に、プログラムのソース コードがどの程度実行されるかを測定するのに役立つ指標です。実行されるコード行と実行されないコード行を特定し、テスト スイートの完全性についての洞察を提供します。高いコード カバレッジは、バグが見逃されて本番環境に持ち込まれるのを防ぐのに役立ちます。
静的コード分析は、プログラムを実行する前に調査してデバッグする手法です。それには、一連のコードを単一(または複数)のコーディング ルール セットに照らして分析します。SASTは、潜在的な脆弱性、バグ、およびコーディング基準の侵害を特定し、コードの品質とセキュリティを向上させるのに役立ちます。静的コード分析ツールは、通常はCI/CDパイプラインに統合されています。
ユニット テストは、ソフトウェア アプリケーションの個々のコンポーネントを単独でテストするソフトウェア テスト手法です。その目的は、ソフトウェアの各ユニットが想定どおりに動作することを検証することです。ユニットは、ソフトウェアのテスト可能な最小単位であり、通常は関数またはメソッドです。ユニット テストは、通常は自動化されており、開発者がコードの正しさを検証するために作成します。開発サイクルの早期段階で問題を検出するのに役立ちます。
統合テストは、個々のユニットを結合してグループとしてテストするタイプのソフトウェア テストです。その目的は、統合したユニット間の相互作用の障害を明らかにすることです。テスト ケースは、ユニット間のインターフェイスの演習という明確な目的を持って作成します。統合テストは、ユニット テストの後にテスト担当者が実行し、トップダウン方式、ボトムアップ方式、またはサンドイッチ方式で実行できます。統合テストでは、インターフェイスの不一致、通信の問題、ユニット テストで見逃される可能性があるデータ関連のエラーなどの問題を明らかにできます。
回帰テストは、以前開発およびテストされたソフトウェアが変更後も引き続き想定どおりに動作することを確認する種類のソフトウェア テストです。その目的は、ソフトウェアに対する変更によって生じる新しいバグ(または以前修正した問題の再発)を捕捉することです。回帰テストは、どのレベルでも、またはすべてのレベルで、実行できます。通常は、以前動作していた機能に不具合が入り込むのを防ぐために自動化します。
フレイキー テストは、同じコードで合格と不合格の両方の結果を示す自動テストです。コードをまったく変更しなくても結果が変化する可能性があるため、予測不可能です。タイミングの問題、特定の状態への依存関係、非同期の操作など、多様な要因によって生じる可能性があります。テスト スイートへの信頼を損なう可能性があり、特定して修正または削除する必要があります。
機能フラグ(または機能トグル)は、開発者が機能をテストし、問題がある機能を速やかにロールバックするためにソフトウェア製品の機能を有効または無効にすることができるソフトウェア開発手法です。開発者は、ソフトウェア製品を本番環境に導入した後でも、機能フラグを使用できます。
カナリア リリースは、変更をインフラストラクチャ全体に展開する前に少数のユーザーに徐々に展開することで、ソフトウェアの新しいバージョンを本番環境に導入する際のリスクを軽減する手法です。ユーザー ベースに対する影響を最小限に抑えながら、テスト段階中に検出されなかった潜在的な問題やバグを捕捉するために使用されます。
ブルー/グリーンデプロイメントは、ブルーおよびグリーンと呼ばれる2つの同一の本番環境を実行することで、ダウンタイムとリスクを減らすリリース管理戦略です。常時、稼働するのは1つの環境のみであり、それがすべての本番トラフィックを処理します。アプリケーションの新しいバージョンをリリースする際、非稼働の環境を更新してテストし、準備ができたら実稼働環境に切り替えます。ブルー/グリーンデプロイメントでは、新しいバージョンで問題が検出された場合、すぐにロールバックできます。
リリース オーケストレーションは、ソフトウェアの変更を本番環境にデリバリーする際の多様な作業を調整するプロセスを指します。作業間の依存関係の管理、ワークフローの自動化、コードのコミットから導入までの各ステップを正しい順序で実行することを含みます。リリース オーケストレーション ツールは、リリース プロセスを可視化することで、チームが複雑な導入を管理し、リスクを軽減するのに役立ちます。

バリュー ストリーム マッピング(VSM)は、製品を概念からデリバリーまで移行させる一連のイベントについて、現在の状態を分析し、将来の状態を設計するための無駄のない管理手法です。CI/CDに関しては、開発から本番環境まで、コード変更の流れを可視化し、プロセスのボトルネック、冗長性、または無駄を特定します。チームがデリバリー ライフサイクル全体を理解し、流れの効率を向上させ、リード タイムを短縮するのに役立ちます。

バリュー ストリームをマッピングすることで、データに基づいてCI/CDパイプラインを最適化するための判断を下すことができ、ビジネス目標との一致度を高めることができます。

サイト信頼性エンジニアリング(SRE)は、ソフトウェア エンジニアリングとシステム エンジニアリングの側面を組み合わせて、スケーラブルで信頼性が高い効率的なシステムを構築および実行するための分野です。Googleで始まり、信頼性に特化したDevOpsの原則を導入します。システムを管理し、問題を解決し、運用作業を自動化するツールとして、ソフトウェアを使用します。主な手法として、サービス レベル目標(SLO)の定義、エラー バジェットの設定、自動化によるつらい仕事の削減などがあります。その目的は、リリース速度とシステムの信頼性の間のバランスを取ることです。