CI/CD ツール入門

CI と CD

CD vs CD Pipeline 出典: 「Setting up GitLab CI/CD for Android projects

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

継続的インテグレーション(Continuous Integration) は通常、開発環境内でコードを統合・ビルド・テストすることを指します。継続的デリバリー(Continuous Delivery)はこれを基盤とし、本番デプロイに必要な最終段階を扱います。 - Martin Fowler on continuous delivery, 2013

何か(What)

  • 継続的インテグレーションは開発プラクティスの 1 つ
  • 共有リポジトリへの頻繁なコード統合に重点を置く
  • コミットされたすべての変更を自動的にビルド・テストすることを含む
  • 統合とテストの頻度を高めるほど、問題は小さくなる
    • 小さな問題ほど修正が容易・迅速になる
  • コードの問題をできるだけ早く・素早く発見することに重点を置く
    • 開発者がコード変更のコンテキストにいるうちに行うため、問題解決が容易になる

なぜか(Why)

  • コード問題やバグの発見の遅れを減らし、リリースを大事ではない出来事にし、修正コストを削減する
  • 開発者がコードに自信を持てるようになり、結果として開発が高速化する

誰のためか(Who)

  • すべての開発組織
  • 特に DevOps の実践を試みている組織

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

継続的デリバリー継続的デプロイ と混同されることがあります。継続的デプロイは、すべての変更がパイプラインを通って自動的に本番環境に投入されることを意味し、結果として 1 日に多数の本番デプロイが行われます。継続的デリバリーは、頻繁なデプロイが可能であることを意味しますが、ビジネス上の理由(より低い頻度のデプロイを好むなど)でそれを行わない選択をすることもあります。継続的デプロイを行うには、継続的デリバリーが行われている必要があります。 - Martin Fowler on continuous delivery, 2013

何か(What)

  • 継続的デリバリーまたは継続的デプロイ、もしくはその両方を意味することがある
  • 継続的デリバリーとデプロイの主な違いは、デリバリー = 手動リリース、デプロイ = 自動リリース
  • いずれにせよ、CD はリリース管理のプラクティス
  • 継続的デリバリーは、ソフトウェアが常にリリース可能な状態にあることを意味する
    • ステージングまたは本番システムへプッシュ可能な状態を意味することもある
    • 出荷・配布可能な状態を意味することもある(すべての企業が Web アプリを作っているわけではない)
  • 継続的デプロイは、パイプラインが正常に完了した時点で実際に変更が本番環境へ自動的にリリースされることを意味する
  • 自動化された、信頼性が高く繰り返し可能なデプロイプロセスは CD にとって重要
  • デプロイアーティファクトを保存・参照する不変の方法は CD にとって重要
    • 例: アーティファクトリポジトリ、コンテナレジストリ
  • フィーチャーフラグはお客様への影響を最小限に抑えながら CD を実現するために重要
  • デプロイ頻度の増加に伴い、何がどこにあるかを追跡するためにデプロイの可視性が重要

なぜか(Why)

  • リリース可能性の継続的なテストにより、各リリースのリスクが低減される - 目標: 退屈なリリース
  • リリースのリスクが低くなると、リリース回数が増え、価値がより頻繁にお客様に届く

誰のためか(Who)

  • すべてのソフトウェア組織(少なくとも「継続的デリバリー」については)
  • すべてのソフトウェア組織が「継続的デプロイ」を必要・希望・到達できるわけではない
  • DevOps イニシアチブを持つ組織は、明示的に定義されていなくても、DevOps が CD を可能にする役割を果たす

市場概要

Forrester CI Wave

Forrester CI Wave

  • CI のみを行うベンダーは今日では生き残れない
  • CI 領域のベンダーはすべて CD を含むよう進化した。これは CI システムの機能の自然な拡張である
  • この進化は主に、環境のプロビジョニングと構成のための統合の追加を伴う(自動化はすでに備わっている機能)
  • コンテナ、マイクロサービス、Kubernetes が CI/CD のあり方を変えた
    • パイプラインを通じたビルドアーティファクトは、アプリケーション環境とセットで包まれるようになった
    • ビルドアーティファクトの代わりにコンテナイメージを保存
    • 完全な統合テストが早期段階でより容易になる
    • CI/CD ツールは、最小限の統合作業でアプリケーションのデプロイに関するすべてを自動化できるようになった
  • そのため現在、CI/CD ベンダーは皆 Docker と Kubernetes のサポート追加を競っている

競合他社のスコープ - 継続的インテグレーション

機能GitLabCircleCIAzure DevOpsJenkinsTravis CIBitbucket
オートスケーリングYYNIntegrationYY
パイプライングラフYYYIntegrationNIntegration
並列ジョブYYYYYY
Config as CodeYYYYYY
ネイティブ Docker サポートYYYIntegrationYY

競合他社のスコープ - 継続的デリバリー/デプロイ(CI 製品)

機能GitLabCircleCIAzure DevOpsJenkinsTravis CIBitbucket
環境YNYNYY
環境履歴YNNNNY
構成不要のステージングアプリYNNNYN
デプロイボードYNYIntegrationYN
ネイティブ Canary デプロイYNYNYN
セキュア変数YNYIntegrationNY
デプロイのトレーサビリティYNYIntegrationYY
保護された環境YNYNNY
ネイティブ Kubernetes サポートYNYIntegrationNN
ネイティブフィーチャーフラグYNNNNN

競合他社のスコープ - 継続的デリバリー/デプロイ(CD 製品)

機能GitLabSpinnakerAzure DevOpsXebiaLabsElectricFlowCodeFresh
環境Y-Y-Y-
環境履歴Y-N-Y-
構成不要のステージングアプリY-N-N-
デプロイボードY-Y-Y-
ネイティブ Canary デプロイY-Y-Y-
セキュア変数Y-Y-Y-
デプロイのトレーサビリティY-Y-Y-
保護された環境Y-Y-Y-
ネイティブ Kubernetes サポートY-Y-N-
ネイティブフィーチャーフラグY-N-N-