昨今のECサイトやSNSなどのWebサービスのように、市場変化の予測が難しくライフサイクルが早いシステムの開発現場では、アジャイル開発やDevOpsといった新しい開発手法が主流になっていますが、それらを語る上で欠かせないのが「CI/CD」という技術です。本記事では、このCI/CDの概要をはじめ、アジャイル開発やDevOpsとの関係についてわかりやすく解説します。
CI/CDとは
まずはCI/CDとは何かが把握できるよう、CIとCDそれぞれの意味について解説します。
CI(継続的インテグレーション)
CIとは“Continuous Integration(継続的なインテグレーション)”の略称です。簡単に言うと、システム開発におけるコードの変更(ビルド)とテストの頻繁な反復作業を効率的に行う手法を意味します。
システム開発において、開発者はコードを少しずつ変更し、その変更に問題がないかテストしてからリポジトリにマージしていきます。というのも、一度に大きな変更を加えてしまうと、問題が生じたときに、どのコードに原因があったのかを特定しにくくなるからです。
しかし、手作業でコードのビルド&テスト作業を頻繁に行うと非常に手間がかかってしまいます。そこでCIでは、コードを共通リポジトリにマージする前のビルド&テスト作業を自動化することで、開発者の作業効率を向上させ、安全かつ素早い開発を可能にするのです。CIは開発中にアプリケーションのブランチが過度に生じて、互いに齟齬が出ることを防ぐためにも役立ちます。
CD(継続的デリバリー)
CDとは“Continuous Delivery(継続的デリバリー)”の略称です。CDは、CIのプロセスを引き継いでビルド段階の後にコードのテストを自動的に行い、テスト環境や本番環境へいつでもデプロイできるように準備します。
CDの主な内容は、アプリケーションのリリース、デプロイ、変更管理(チケッティング)、変更内容の確認と監視などです。CDによって、開発者は作業内容を本番環境に移行させる際の検証プロセスに厳密性を持たせ、安全かつ頻繁に配信することが可能になります。
CD(継続的デプロイメント)
CDには「継続的デリバリー」以外にも、“Continuous Deployment(継続的デプロイメント)”という意味もあります。継続的デプロイメントは、継続的デリバリーの次のステップであり、すべてのコード変更が自動的に本番環境に導入されるようにする開発手法です。
継続的デリバリーにおいては、新しいコード変更を本番環境に移行させる最終的な操作は人間が手動で行いますが、継続的デプロイメントを導入することで、その最終的な移行ステップも自動化されます。継続的デプロイメントによって、作業の成果物は顧客が触れる本番環境へシームレスに移行されるため、顧客からのフィードバックの加速も期待できます。
CIとCDの違いを総じて言うと、CIは開発者がコードを書いているときに実行する自動化プロセスであり、CDはコードが完成した後に必要な処理を実行する自動化プロセスです。
CI/CDとDevOps
CI/CDはDevOpsと緊密な関係を持っています。
DevOpsとは、“Development and Operations(開発と運用)”の略称で、開発チームと運用チームの間の迅速かつスムーズな連携を促進する開発手法や開発思想のことです。従来、開発チームと運用チームは別々に作業していましたが、保守運用のしやすさなどを顧みないシステム開発は、最終的には組織全体の生産性低下を引き起こしてしまいます。そこで、開発と運用の垣根を超えたチーム横断的なコラボレーションを核とするDevOpsの必要性が認識されるようになったのです。
このようにDevOpsは、「開発チームと運用チームのコラボレーション」をコンセプトにした概念であり、ソフトウェア開発プロセスの「自動化」を核心とするCI/CDとは異なります。しかし、開発チームと運用チームが協働するにしても、その協働プロセスは手動で行うよりも、ツールを使用して可能な限り多くの作業を自動化した方がはるかに効率的です。
このため、DevOpsを軸にした開発体制においては、コードのビルド・テスト・デプロイの各ステップを自動化するCI/CDを積極的に取り入れ、開発のライフサイクル全体を効率的に処理することが重んじられているのです。
つまり、CI/CDはDevOpsによる開発体制を実現するための重要なアプローチ方法であると位置づけられます。
CI/CDとアジャイル開発
CI/CDはアジャイル開発を実現するための鍵でもあります。
アジャイル(agile)とは「迅速さ」を指す英語で、アジャイル開発とはその名の通り、開発とリリースのサイクルを一週間から一ヶ月程度の短期間で素早く回していく開発方法を意味します。従来のシステム開発(ウォーターフォール開発)においては、最初に全体から細部までの要件定義を行い、数ヶ月以上も時間をかけて緻密にシステムを構築した上でリリースしていました。しかし、システム開発には仕様変更が付き物であり、設計からテストまでを一貫したプロセスで行うウォーターフォール開発は、仕様変更に対応するための柔軟性に欠けています。
そこで登場したのが、ウォーターフォール開発とは対照的に、機能単位で順次開発とリリースをしていくアジャイル開発です。システムの核となる重要部分から機能単位で開発を進めることで、アジャイル開発は短期間で製品をリリースし、実際に製品を使用した顧客のフィードバックなどを反映しながらシステム開発ができます。開発途中で何か問題が生じた場合も、基本的には追加した新しい機能を切り離して問題を特定・修正すればいいだけなのも利点です。
しかし、開発とリリースを何度も繰り返すということは、それだけコードに加える変更・テスト・デプロイの手間や回数も増えるということです。そこで、アジャイル開発においては、そうした作業負荷を軽減・効率化し、短期間での開発を可能にするための手段としてCI/CDによる自動化が重視されています。アジャイル開発においては顧客との連携が重要になりますが、CI/CDは自動的にアプリケーションを本番環境に移行させ、迅速に顧客からフィードバックが受けられるようにするためにも重要です。
つまり、DevOpsにしてもアジャイル開発にしても、それらの開発哲学をより高度に実現するにはCI/CDによる自動化プロセスが不可欠なのです。
CI/CDのメリット
CI/CDを導入することで、開発チームはどのような効果を得られるのでしょうか。以下では、CI/CDの主なメリットについて解説します。
開発スピードの向上
CI/CDの第一のメリットは開発速度の向上です。CI/CDによってビルド・テスト・デプロイのプロセスを自動化することで、手動で作業するよりも開発速度を加速できます。従来の開発では、リリースまでに数ヶ月以上かかるのが常でしたが、CI/CDとアジャイル開発を組み合わせることで、一週間単位で開発サイクルを回していくことさえ可能になるのです。開発スピードの加速は、製品の市場投入のスピードアップと同義であり、顧客や市場のニーズを逃さないビジネスを実現できます。
生産性の向上
生産性の向上もCI/CDのメリットのひとつです。CI/CDを導入することで、開発者は手作業でのテストスプリクトの実施やデプロイ作業を行う必要がなくなるため、その分の余力をコードの開発という、より創造的な作業に費やせるようになります。これによって、最終的な製品の品質向上が期待できるでしょう。
コード品質の向上
コード品質の向上も期待できる効果です。コードの動作をテストすることは、品質向上のための重要なステップですが、それを徹底的に行うには時間と手間がかかります。しかし、CI/CDによってテストを自動化すれば、テストは一貫した基準によって実行され、コードに問題がないか迅速かつ確実にチェックできます。手動でテストする場合は、開発者の注意力不足などを警戒しなければいけませんが、自動化すればその心配も無用です。開発者は、CI/CDを導入することで、手動と同等以上の信頼性を担保しつつテストを頻繁に実施し、バグの早期検出・早期修正を行い、コード品質を確保できるのです。
リリース後のバグ修正の高速化
自動化されたテストによってコード品質が向上をしたとしても、バグが本番環境に潜んでいる可能性は否定しきれません。しかし、アジャイル開発とCI/CDを組み合わせて機能単位で頻繁に製品をリリースしている場合、本番環境への各移行段階において含まれるコード変更は比較的少数に過ぎません。したがって、本番環境で何かバグが生じたとしても、その原因を特定するのは基本的に容易で、正常な部分に影響を与えることなく修正しやすくなります。
CI/CDのデメリット
CI/CDを導入する際には、以下のように、いくつかのデメリットまたは注意点もあります。
ビルドスクリプトやテストコードを作成する必要がある
CI/CDの第一のデメリットは、自動化を可能にするための作業負担が発生することです。CI/CDに伴って開発プロセスの自動化を実現するには、その準備作業としてビルドスクリプトやテストコードなどを作る必要があります。また、CI/CDの導入後も、自動化コードのメンテナンスは必要ですし、テストに新しい条件を加えたり精度を上げたりする際にも、当然コードを書かなければなりません。
ウォーターフォール開発の場合は費用対効果が少ない
CI/CDはアジャイル開発との相性が抜群な一方で、ウォーターフォール開発の場合には、それほど費用対効果を見込めないのも注意点です。先述のように、アジャイル開発であれば、開発とリリースのサイクルが頻繁であるため、CI/CDによる自動化プロセスを利用する機会も多く、それだけ効果の大きさを実感できるでしょう。しかし、ウォーターフォール開発の場合は長期スパンで開発を行うため、ビルド・テスト・デプロイの工程を何度も繰り返すわけではなく、CI/CDを導入しても高い費用対効果は見込めません。
CI/CDパイプラインとは
CI/CDについて語る際、「CI/CDパイプライン」という言葉を耳にする機会が多々あります。CI/CDパイプラインとは簡単に言うと、CI/CDの導入によって自動化した一連のソフトウェア配信プロセスのことです。
具体的な工程としては、ビルド、テスト、リリース、デプロイ、検証およびコンプライアンスなどが挙げられます。これらのタスクを自動化することで、開発チームは品質の向上、開発の高速化など、ここまで挙げてきたCI/CDの導入効果を実現できます。また、タスク間の処理も自動化することで、CI/CDパイプラインの効果をより高められます。
CI/CDパイプラインを構築するツール
CI/CDパイプラインは、以下のようなツールを活用することで構築できます。
- コードリポジトリ/成果物リポジトリ
成果物やコードのバージョン管理などを行うツールです。 - CIツール
コード変更に伴い、ビルドやテストをするためにツール間の連携を行います。 - 構成管理ツール
インフラ構築の自動化や、管理を行うツールです。 - ビルドツール
ビルドの実行を自動処理するツールです。 - テストツール
アプリケーションの品質検証のために機能テストや負荷テストを実行するツールです。
CI/CDパイプラインの活用用途
昨今の開発現場において、CI/CDパイプラインは広く導入が進んでいます。CI/CDパイプラインの主な用途としては、以下のようなものが挙げられます。
アジャイル開発・DevOpsとの併用
CI/CDパイプラインの用途としてまず挙げられるのが、アジャイル開発やDevOpsとの併用です。すでにご紹介したように、DevOpsは開発と運用の連携を迅速かつ効率的に行う開発の仕方です。一方でアジャイル開発は、短期サイクルで機能ごとに開発とリリースを繰り返していく開発方法を指します。CI/CDパイプラインによる開発プロセスの自動処理を活用することで、アジャイル開発とDevOpsそれぞれの効果を高めることが可能です。
マイクロサービスの開発
マイクロサービスとは、ソフトウェアを柔軟かつスケーラブルに開発するためのアーキテクチャの一種です。マイクロサービスでは、個々のサービスを独立的に開発し、それらを組み合わせることでひとつのサービスを構築します。「機能単位に開発を進める」というアジャイル開発の特性は、まさにこのマイクロサービスが可能にするものです。
このため、マイクロサービスにおけるCI/CDの重要性は、アジャイル開発におけるCI/CDの重要性と類似しています。自動化されたCI/CDパイプラインがないと、開発者は作成したいくつものマイクロサービスをアプリケーション全体に統合する際に、非常に手間と時間がかかってしまいます。
そうなれば、サービス全体の構築とリリースが遅くなり、マイクロサービスおよびアジャイル開発の強みのひとつである迅速性は損なわれてしまうでしょう。マイクロサービスの効果を最大化するためにも、ビルドから検証、デプロイまでを自動化するCI/CDパイプラインが必要なのです。
コンテナ技術との組み合わせ
CI/CDパイプラインはコンテナ技術と組み合わせるのもおすすめです。
コンテナとは簡単に言うと、アプリケーション開発をする際に、コードのビルドとテストに必要な独立環境を用意する仮想化技術です。コンテナ技術は、通常の仮想マシンと比べて軽量で起動が速いため、余分な時間やリソースを消費することなくテスト環境を用意できます。また、コンテナ技術は他のプロセスから切り離された独立環境であるため、テスト環境を整備しやすいのも強みです。
ここまで述べてきたように、CI/CDは何度もビルド、テスト、デプロイなどを繰り返すことを前提にした技術ですが、ビルドやテストのための環境をその都度時間や手間をかけて用意しなければならないとしたら、CI/CDによる開発速度の向上効果は半減してしまいます。また、テスト環境に以前の成果物などが残っていれば、テストの信頼性に悪影響も出るでしょう。
コンテナ技術は、CI/CDのそうした不安な点を解消するベストなソリューションです。コンテナを活用した上でCI/CDを実行することで、コード品質の安定性をさらに高めつつ、より迅速な開発を実現できるのです。
まとめ
CI/CDを導入することで、開発チームはソフトウェア開発におけるビルド、テスト、デプロイなどのプロセスを自動化し、開発速度やコード品質の向上などを実現できます。CI/CDのこうした効果は、現在主流になりつつあるアジャイル開発やDevOpsを実現するためにも不可欠であり、マイクロサービスやコンテナ技術などと共に、今後もさらに活用が広がっていくと予想されます。
「Dagger」は、Docker創始者らが開発したCI/CDプロセスの短縮に役立つオープンソースのCI/CD環境構築ツールで、2022年3月に公開され注目を集めています。
- カテゴリ:
- デジタルプラットフォーム