CI/CDとは

CI/CDは、継続的インテグレーション(CI)と継続的デリバリーまたはデプロイメント(CD)を組み合わせた実践です。CI/CDの目的は、開発チームがコードの変更をより頻度かつ確実に提供できるようにすることです。

継続的インテグレーション、継続的デリバリー、継続的デプロイメントの違いとは?

CI/CDにおけるCIは、継続的インテグレーションを表しています。継続的インテグレーションとは、開発者がコードの変更を頻繁に共有リポジトリに統合することを意味します。複数名の開発者が、統合時に競合することなく、同じプロジェクトにソフトウェアコンポーネントを提供できるようにするための自動化されたプロセスです。CIでは、ソフトウェアへの変更がリポジトリに統合されるたびに、自動化されたテストが実行されます。

CDは、継続的デリバリーまたは継続的デプロイメントのいずれかを意味します。どちらでも、統合されたコードを、QAまたは本番環境のいずれかに、継続的にデプロイできるようにする必要があります。継続的デプロイメントは、このプロセスをさらに一歩進めたもので、環境への実際のデプロイメントを実行します。

継続的インテグレーションが重要となる理由

コードベースの大規模な部分が一度に変更された場合、アプリケーションの品質に対するリスクが高くなります。これは、変更が大きくなればなるほど、何かが壊れる可能性も高くなり、トラブルシューティングも難しくなるからです。アジャイルな組織は、コードの統合や自動化されたテストを頻繁に実施することで、導入、根本原因の特定、バグ修正にかかるコストを削減しています。

CIでは自動化が重要な鍵となります。継続的なインテグレーションを成功させるために必要なスピードに、手作業で追いつくことは不可能です。開発者は頻繁に統合をおこなう必要があり、迅速なフィードバックを必要とします。

継続的デリバリーと継続的デプロイメントは、リリースの出荷に関わる時間、労力、リスクを削減するために自動化を使用していることから、目標も類似しています。継続的デリバリーは迅速かつ効率的です。各環境でそれぞれのビルドが自動的にテストされ、合格した場合にはワンクリックでコードを手動でデプロイすることができます。準備は自動化されますが、ほとんどの場合、本番環境へのプッシュは運用チームが開始します。

本番環境へのリリースが完全に自動化されている継続的デプロイメントでは、コントロールの一部を手放すことになります。同時に、他の利点を得ることにもなります。リリースに向けて開発を中断する必要がなくなるため、すでに迅速な継続的デリバリーがさらに迅速な開発となり、お客様も改善が定期的にリリースされることを評価するようになります。

CI/CDにおける主な課題とは

CI/CDには利点がたくさんありますが、プロセスを導入する際には課題が発生する可能性があります。最初に、継続的インテグレーションと継続的デリバリー/デプロイメントは関連しているものの、CI/CDパイプラインの中では異なる部分です。組織がこの違いを理解していないと、CIのみを単独で実装しながらCI/CDと呼んでしまう可能性があります。CI/CDを適切に行うには、継続的なコード統合(これは多くの場合、CI専用ツールでおこないます)を、テストとデプロイメントの自動化プロセスに反映させる必要があります。

CI/CDには、多くの人が関わります。DevOps手法と同様に、開発、QA、および運用チームとの間で強固なコラボレーションが必要とされます(これも、多くの組織にとってもう1つの課題となります)。開発、QA、運用チームがそれぞれ、一見矛盾した目標を追求しているように見受けられることから、チームはしばしば悩まされることになります。開発者はコードを迅速に実装し、自由に創造したいと考えています。QA担当者は、バグが含まれるリリースを最小限に抑えるために、コードをテストしたいと考えています。そして運用チームは、コードを安全かつ正確、コントロールできる方法でリリースして実行したいと考えています。幸い、CI/CDのセットアップが良好であれば、こういったタイプの連携が容易になります。開発者はデバッグに時間を取られることななり、生産性と効率性を維持することができ、運用チームはリリースに向けたコードの準備を安心して行うことができます。1つのチームから別のチームへの移行は自動化され、煩わしさも少なくなります。最良の結果を得るには、パイプラインとプロセス全体のどの部分を誰が所有しているのかについて、誰もが明確に把握することが重要です。

さらに、新たなCI/CDプロセスをどのように実装するかという課題もあります。頻繁に繰り返されるプロセスは、CI/CDパイプラインを遅らせる可能性があり、手動でおこなった場合にはエラーも発生しやすくなるため、自動化することが不可欠です。小規模なチーム内で自動化を始めて、経営層に成功を示し、より大規模な自動化に取り組みくむことが推奨されます。

セキュリティは今日のすべての組織にとっての課題であり、セキュリティ対策は、ソフトウェア開発ライフサイクル(SDLC)のできるだけ早い段階で統合されるべきものでありながら、DevOpsプロセスでは後回しにされることがあまりにも頻繁にあります。この方法であれば、セキュリティリスクが早期に検知され、修正にかかるコストも低くなります。

CI/CDモデルを採用するべき理由

CI/CDは、市場投入に必要な時間を短縮します。自動化はプロセスの一部を効率化し、エラーの検出を迅速にするため、解決するまでの時間を短縮することにつながります。また、定期的な更新と肯定的なユーザーエクスペリエンスを提供することで、顧客の満足度も向上させることができます。

段階的な変更とCIの自動化された統合により、更新のたびにコードの品質を向上させることができます。欠陥のあるコードが本番環境に流出するケースを減らすことで、ビジネスに数え切れないほどの肯定的な影響をもたらします。

スピードと精度が向上すると、コストが低下します。CIサーバーは、数秒内に何百件ものテストを実行し、テストにかかるコストを大幅に削減することができます。CI/CDを採用している競合他社は間違いなく存在しており、従来のモデルに固執すると、遅れをとることになります。

組織でCI/CDを採用し始める方法

CI/CDへの移行は、段階的におこなうのが最良です。段階的におこなうことで、開発者はプロセスへの変更について学び、適応させることができ、本番環境のシステムに導入する前に、新しいプロセスを完全にテストすることができます。

CI/CDを首尾よく成功させたければ、次のステップから始めてください。

  1. 開発者のマシンからソフトウェアを移動させ、不一致があれば解消し、GitやSVNなどのバージョン管理(VC)プロセスに移行します。
  2. Vagrantまたは他の類似したツールを使用してローカル デベロッパー インスタンスを構築し、ローカルでテストできるようにします。
  3. VCにコードをプッシュし、マージする際の競合に対処するための手順を文書化します。スタッフは適切にトレーニングします。
  4. 必要に応じて、VCプロセスから本番環境のボックスへとコードを移行します。

CI/CDへの完全な移行を開始するための堅固な基盤が構築されたら、次の段階へと進みます。

  1. 開発者がプッシュするためのステージングサーバーを追加します。このサーバーを用意することで、本番環境の前にQAテストを実施できます。
  2. JenkinsなどのCI/Cツールを選択して、ステージングから本番環境へのプッシュを自動化します。この段階で、基本的な構文チェックプログラムを導入するもできます。
  3. InsightAppSecなどの動的アプリケーションセキュリティ テスト(DAST)ソリューション、Seleniumなどの自動QAテスト、およびその他のコンパイル手順(JavaScript、CSS、ファイルの連結、ソフトウェアのソースでのCVEのチェックなど)でセキュリティ構築を開始します。

これで、機能的なCI/プロセスが完成します。自動化の多くはソフトウェアで実行されますが、開発者がソフトウェアとプロセスの両方について適切なトレーニングを受けることが不可欠です。