CI/CDツールの本当の役割:機能別分類で理解する

アプリケーションをビルド、テスト、デプロイするパイプラインは動いている。しかし、何かが壊れたとき、どのツールが何を担当しているのかわからなくなる。CIサーバーがダウンしているのにデプロイは実行された。アーティファクトレジストリには同じビルドのバージョンが3つあり、どれが正しいのか誰も知らない。データベースマイグレーションが2回実行され、スキーマの状態が不明になった。

この混乱は、各ツールの役割を理解せずに、名前や人気だけでツールを選んだときに起こる。CIサーバーはデプロイツールの代わりにはならない。フィーチャーフラグシステムはシークレットマネージャーではない。可観測性プラットフォームは変更管理を行わない。

ここでは、モダンなデリバリーパイプラインを構成する9つのツールカテゴリを機能別に分類する。各カテゴリには、他のカテゴリでは代替できない固有の役割がある。

CIサーバー:パイプラインの頭脳

CIサーバーは、リポジトリを監視し、パイプラインを自動実行するエンジンである。開発者がコードをプッシュすると、CIサーバーが変更を検知し、ビルド手順を実行し、テストを実施し、アーティファクトを生成する。

CIサーバーがなければ、コード変更のたびに開発者が手動でコードをチェックアウトし、ビルドし、結果を確認しなければならない。これでは1人が1つの機能に取り組む規模を超えるとスケールしない。

CIサーバーはパイプライン全体を統制する。何を、どの順序で実行するか、ステップが失敗した場合の処理を決定する。デリバリープロセスの中枢神経系である。

以下の図は、9つのツールカテゴリが典型的なデリバリーパイプラインでどのように連携するかを示している:

flowchart TD CI[CIサーバー] --> AR[アーティファクトレジストリ] AR --> DT[デプロイツール] DT --> FF[フィーチャーフラグシステム] FF --> OBS[可観測性プラットフォーム] IaC[IaCツール] --> DT DBM[DBマイグレーションツール] --> DT SM[シークレット管理] -.-> CI SM -.-> DT SM -.-> FF CM[変更管理ツール] -.-> CI CM -.-> DT CM -.-> OBS

アーティファクトレジストリ:ストレージ層

CIサーバーがビルドを完了すると、アーティファクトが生成される。そのアーティファクトには、後でデプロイツールが参照できる永続的な保存場所が必要である。

アーティファクトレジストリは、すべてのバージョンのビルドをメタデータ(バージョン番号、ビルドハッシュ、依存関係、場合によってはセキュリティスキャン結果)とともに保存する。その役割はシンプルだが極めて重要である。すべてのテストに合格したアーティファクトが、デプロイされるアーティファクトと同一であることを保証する。

レジストリがないと、チームはデプロイ時にソースから再ビルドすることになり、リスクが生じる。1時間前に実行したビルドでも、依存関係が変わったり、ビルド環境が同一でなければ、異なる出力になる可能性がある。

デプロイツール:配置エンジン

デプロイツールは、レジストリからアーティファクトを取得し、ターゲット環境に配置する。環境設定を読み込み、正しいアーティファクトを取得し、デプロイプロセスを実行する。

デプロイツールは、ブルーグリーン、カナリア、ローリングアップデートなどの戦略を処理する。旧バージョンから新バージョンへの移行を最小限の中断で管理する。

重要な違いは、デプロイツールはインフラストラクチャを構築しないことである。既存のインフラストラクチャにアプリケーションを配置する。サーバー、ネットワーク、クラウドリソースを作成する必要がある場合は、別のツールの役割である。

IaCツール:インフラストラクチャビルダー

Infrastructure as Codeツールは、インフラストラクチャをプログラムで作成・管理する。サーバー、データベース、ネットワーク、ロードバランサー、クラウドリソースを、バージョン管理、レビュー、一貫性のある適用が可能なコードとして定義する。

IaCツールとデプロイツールは、しばしば順番に動作する。IaCツールが環境を準備し、デプロイツールがその環境にアプリケーションを配置する。この2つの責任を混在させると、インフラストラクチャの変更とアプリケーションのデプロイが絡み合い、脆いパイプラインになる。

データベースマイグレーションツール:スキーママネージャー

データベースマイグレーションは特殊な変更である。アプリケーションが依存するスキーマを変更し、順序通りに実行する必要がある。マイグレーションスクリプトを順序を間違えて実行したり、1つスキップしたりすると、データが破損する可能性がある。

マイグレーションツールは、現在適用されているスキーマのバージョンを追跡する。まだ実行されていないマイグレーションのみを実行する。前方への移動方法と、多くの場合、後方への移動方法を知っている。

マイグレーションツールがないと、チームはSQLスクリプトを手動で実行したり、スキーマ変更をアプリケーションコードに埋め込んだりする。どちらのアプローチも脆弱でエラーが発生しやすく、特に複数の開発者が同じデータベースを操作する場合に顕著である。

フィーチャーフラグシステム:リリースデカップラー

フィーチャーフラグは、デプロイとリリースを分離する。機能をオフにした状態でコードをデプロイし、後で特定のユーザー、リージョン、条件に対して有効にできる。

これにより、きめ細かい制御が可能になる。新機能をまず小規模なグループでテストできる。問題が発生した場合は、デプロイ全体をロールバックせずに機能をオフにできる。問題がなければ、徐々に対象を拡大する。

フィーチャーフラグは設定ファイルではない。再デプロイせずにアプリケーションの動作を変更できるランタイム制御システムである。

シークレット管理:認証情報の保管庫

シークレットとは、パスワード、APIキー、証明書、トークンである。これらは安全に保存され、必要な時に必要なサービスだけがアクセスできるようにしなければならない。

シークレット管理ツールは、保存時と転送時のシークレットを暗号化する。アイデンティティとコンテキストに基づいてアクセスを制御する。認証情報を自動的にローテーションし、すべてのアクセス試行を記録する。

設定ファイルや環境変数にシークレットをハードコーディングすることは、シークレット管理ではない。それは発生待ちのセキュリティインシデントである。

可観測性プラットフォーム:可視性層

可観測性は、実行中のシステムからログ、メトリクス、トレースを収集する。本番環境でアプリケーションが何をしているかを理解する能力を提供する。

これは従来の監視とは異なる。監視はシステムが稼働しているか停止しているかを教える。可観測性は、システムがなぜそのように動作しているのかを教える。問題のデバッグ、パフォーマンスの理解、インシデントになる前の異常の検出に役立つ。

変更管理ツール:監査証跡

パイプラインを通過するすべての変更は痕跡を残す。変更管理ツールは、誰が、何を、いつ、なぜ変更したかを記録する。

これはガバナンスとコンプライアンスに不可欠である。問題が発生した場合、何が変更され、誰が承認したかを正確に知る必要がある。変更管理ツールがなければ、記憶、チャットログ、スプレッドシートに頼ることになる。

実践的なチェックリスト

パイプラインに新しいツールを追加する前に、以下の質問を自問してほしい:

  • このツールはどのカテゴリに属するか?
  • このカテゴリにはすでにツールがあるか?
  • 新しいツールは既存のツールの機能と重複するか?
  • 重複する場合、どちらがその機能を担当すべきか?

まとめ

ツールは互換性がない。CIサーバーはデプロイを実行できない。デプロイツールはシークレットを管理できない。アーティファクトレジストリはマイグレーションを実行できない。名前だけでなく機能を理解すれば、どのツールが何をするのか推測する必要がなくなる。問題が発生したときに、明確で、保守可能で、実際に機能するパイプラインを構築できる。