継続的デリバリーまたは CD とは、ソフトウェアを本番環境にリリースできるように準備する際に必要な手動のステップを自動化する手法です。
継続的デリバリー(CD)は、継続的インテグレーション(CI)に基づいてソフトウェアの本番環境へのリリースを準備する際に必要なステップを自動化する手法です。
コード変更を指定のブランチにマージするたびに継続的インテグレーションのプロセスによって自動ユニットテストなどの一連のチェックが実行され、ビルドが作成されます。 継続的デリバリーはこのプロセスをさらに拡張し、一連のテスト環境とステージング環境に各ビルドを自動的にデプロイした後、さらなる自動テストを実行します。
このような自動テストには、統合テスト、UI テスト、パフォーマンステスト(負荷、ソーク、ストレステストなど)、およびエンドツーエンドテストが含まれる場合があります。 業界によっては、継続的デリバリーを使用してセキュリティテスト、アクセシビリティテスト、および手動のユーザー受け入れテストや探索的テストも実行する場合があります。 ビルドは各ステージを正常に合格すると、本番環境へのリリースできる状態になったと見なされます。
継続的インテグレーションと同様、継続的デリバリーを効果的に実践するには、可能な限り多くのプロセスを自動化するのが重要です。 このようなプロセスには、各ステージに対するフィードバックを提供することや、ビルドがステージを合格できなかった場合にチームに警告して迅速に問題に対処できるようにすることなどが挙げられます。
継続的デリバリーと継続的デプロイは、どちらも自動的に環境にビルドをデプロイして自動テストを実行する処理が伴います。 そのため、これら 2 つの用語は同義的に使用されることがありますが、 継続的デリバリーと継続的デプロイには立派な違いがあります。
継続的デプロイの場合、コード変更は各テストステージを正常に合格するたびに自動的に本番環境にデプロイされます。 これに対し、継続的デリバリーの場合はソフトウェアを本番環境にリリースする最終ステージに手動のステップが伴います。
継続的デプロイはあらゆるソフトウェア開発チームが理想とする目標のように聞こえるかもしれませんが、継続的デリバリーを実践しないことを選択するチームが多数存在するのにはそれなりの理由があります。
CI/CD プロセスの最後のステージには、本番環境へコードの変更をデプロイする処理が伴います。 継続的デリバリーの場合、本番環境へのリリースプロセス自体は自動であっても、リリースの決定は手動のステップです。
継続デリバリーを継続的デプロイに拡張するための足掛かりとして実践するチームもあります。 本番環境への最終デプロイを手動で行うことは、自動テストとチェックに信頼を置けるようになるまでの安全策になるためです。 このような場合、すべての正常なコードの変更を本番環境に自動的にデプロイする前に数か月ほど継続的デリバリーを実践するのが良いでしょう。
ただし、ソフトウェアの更新を 1 日または 1 時間ごとに数回デプロイするのは必ずしも最善の選択とは言えません。 モバイルアプリ、API、組み込みソフトウェア、デスクトップ製品などのバージョン管理されたソフトウェアの場合、変更をより大きなリリースにまとめる方が合理的な場合も少なくありません。 インストールされている製品のユーザーは数時間ごとにアプリの更新を要求されることを想定していませんが、新しい API のバージョンにアップグレードした場合は顧客に著しい影響が出る可能性があります。 継続的デリバリーと継続的デプロイのどちらにするかを決める場合は、ビジネスとユーザーにとって適切な判断を下すことが重要です。
実際のビルドステップ、環境、およびテストは取り扱う製品や組織によって異なるものの、継続的デリバリープロセスは以下の一般的な原則に従って構築することができます。
継続的デリバリーを採用したチームはソフトウェアのリリースをより迅速かつ頻繫に行いながら、本番環境に入り込むバグの数を減らすことができます。 これを達成するには、継続的に変更をテストして検出された問題をすぐに解決することにより、常にコードをリリース可能な状態に維持することが重要です。
また、継続的デリバリーによって次のような複数のメリットも得ることができます。
継続的デリバリープロセスの導入には、いくつかの課題が伴う場合があります。
継続的デリバリープロセスの構築は面倒に思えるかもしれませんが、正しく行えば、バグの数を最小限に抑えながら、ソフトウェアのリリース速度を大幅に向上させることができます。
継続的デリバリーを効果的に導入するには、主に DevOps の考え方を採用する必要があります。 DevOps ではソフトウェアの開発プロセスをチームからチームに受け渡される要件、コード、レポートを載せた一方通行のベルトコンベアとして見なす代わりに、短期間の反復的なサイクルから得られるコラボレーションと迅速なフィードバックが重要となります。
「完了の定義」を変えると、この考え方を採用しやすくなります。 コードをテストに受け渡した時点をタスクの完了とするのではなく、新しい機能またはコードの変更が本番にリリースされた時に初めて完了とするのです。 このパイプラインのどこかの段階で問題が見つかった場合、そのフィードバックを迅速に伝達し合いながら共に修正に取り組むことで、長々としたレポートを変更委員会の承認に通さなければならないプロセスよりも迅速に解決に持ち込むことができます。 これが継続的デリバリーの本質です。
継続的デリバリーの導入を開始するのに役立つその他のヒントについては、CI/CD ベストプラクティスガイドをご覧ください。
継続的デリバリーはソフトウェアをより簡単かつ迅速にリリースするための手法であり、本番環境への頻繁なデプロイを可能にします。 大規模な四半期または1年ごとにリリースするのではなく、より規模の小さな更新を頻繁に提供するのです。 それによってユーザーに新機能やバグ修正を提供するまでの期間を短縮できるだけでなく、開発したソフトウェアが実際の現場でどのように使用されているのかを観察し、適宜に計画を調整できるようになります。
リリースプロセスの最終ステップを従来通りに制御することを好む組織もあれば、CI/CD パイプラインを継続的デプロイという手法で本番へのリリースを自動化することを必然的に結論とする組織もあります。 これについては、CI/CD ガイドの次のセクションで詳しくご覧ください。
TeamCity は、さまざまなビルドツール、テストフレームワーク、コンテナー、およびクラウドインフラストラクチャプロバイダーを幅広くサポートする CI/CD プラットフォームです。 ビルドマシンをオンサイトでホストする場合でも、クラウドにホストする場合でも、両方を組み合わせて使用する場合でも、TeamCity はビルドタスクを調整し、最大限の効率を引き出します。
TeamCity のカスタマイズ可能なパイプラインロジックにより、複数の異なるプラットフォームに対するテストなどのプロセスを同時に実行するタイミングや、次のステージに進む前に正常な完了を要求するタイミングを選択できます。 作業場所を問わず、構成可能な通知によって必要な情報を得られるため、不要な中断を避けることができます。 最後に付け加えますが、詳細な結果を得られるため、本番環境までの過程を明確にできます。