CI/CDとは?概要からメリット、代表的なツールまでをわかりやすく解説

近年の開発現場では、CI/CD(継続的インテグレーション/継続的デリバリー)またはCI/CDパイプラインという言葉を耳にすることが増えてきました。しかし、「CI/CDとは?」「なぜ必要なのか?」といった疑問を抱えている方も多いのではないでしょうか。
本記事では、CI/CDの概要とメリット、さらにアジャイル開発やDevOpsとの関連について解説します。また、代表的なCI/CDツールについても紹介しますので、さらに理解を深めることができます。
CI/CDとは
CI/CDとは、「CI」を継続的インテグレーション(Continuous Integration)、そして「CD」を継続的デリバリー(Continuous Delivery)あるいは継続的デプロイメント(Continuous Deployment)を指します。
CI(継続的インテグレーション)
リポジトリ内のコードに変更が加えられるたびに、ソースの静的解析やビルドとテストを自動的に実行する仕組みです。
CD(継続的デリバリー/継続的デプロイメント)
継続的デリバリーは、CIによってテストまで行い、品質が担保された状態で本番環境へのデプロイは手動で行う仕組みです。デプロイの最終判断は手動で行われるため、承認プロセスを挟むことでタイミングを柔軟に調整できます。
一方、継続的デプロイメントは継続的デリバリーと異なり、デプロイの際に人の手を介さず全て自動化する仕組みです。
DevOpsとの関係
DevOpsは、Dev(開発チーム)とOps(運用チーム)で、ビジネスの成功という共通目的のため、互いに協調しソフトウェアの開発/運用するための文化を指します。DevOpsでは、継続的デリバリーの自動化が重視されているため、その方法としてCI/CDが注目されています。
アジャイル開発との関係
以前の開発現場では、ウォーターフォールの開発手法が主流でした。この手法は、上流工程から下流工程へ順に進めていきます。ただし、1つの工程が完了しないと次の工程に進めない仕組みになっているため、開発途中で設計変更などが発生すると、余分な時間や工数が必要になるケースも少なくありませんでした。
一方、近年では開発スピードの重要性が高まり、アジャイル開発手法が広く採用されるようになりました。この開発手法では、機能単位で小さなサイクルを繰り返しながら開発を進めるため、開発途中で発生する設計変更などにも柔軟に対応できます。
さらにCI/CDを活用することで、コードの変更からデプロイまでを迅速に行うことができ、アジャイル開発における小さなサイクルでの開発を支える重要な仕組みです。これにより、開発スピードを大幅に向上させると同時に、品質も維持しながら安定した運用を実現します。
CI/CDを導入するメリット
CI/CDを導入することで、ビルドやテスト、デプロイが自動化されることにより、以下のメリットが挙げられます。

テストの抜け漏れ防止
手動で何十から何百のテスト項目を実行する場合、実行し忘れが発生することがあります。実行漏れを含んだ状態でリリースすれば、品質の低下や重大なバグの発生につながる可能性がある。
CI/CDを導入することで、コードの変更が加えられるたびに自動的にテストが実行されるため、実行漏れがなくなり一定の品質を確保できます。
開発サイクルの高速化
手作業でのビルドやテスト、デプロイを行うには多くの時間と労力が必要でした。
CI/CDを導入することで、これらの工程がすべて自動化されてリリースまでの時間を大幅に削減できます。開発サイクルが加速し、より効率的にリリースが可能になります。
コード品質の向上
アジャイル開発の短いサイクルとCI/CDを組み合わせることで、テストを効率的に実行し、コードのエラーやバグを早期に発見できるようになります。発見したエラーやバグを即座に修正できるため、コードの品質向上に直結します。
代表的なCI/CDツール
Jenkins
Jenkinsは、オンプレミス型のCIツールで、川口耕介氏によって開発され2011年にオープンソースソフトウェア(OSS)として公開されました。豊富なプラグインにより、ニーズに合わせた機能拡張やカスタマイズが行えます。
Jenkinsの役割は「コントローラ」と「エージェント」の2種類です。コントローラは、エージェントへのジョブ実行指示やエージェントの管理、プラグイン管理、さらにJenkins全体の管理を行っています。一方、エージェントはコントローラからの指示を受けてジョブ実行するサーバです。
コントローラでジョブ作成してジョブの定義には、自動化するプロセスの順番や処理内容を記述します。コントローラからエージェントに対してジョブ実行の指示を行い、エージェントはジョブ定義に従ってジョブ実行します。
CircleCI
CircleCIは、SaaS型のCI/CDツールです。実行環境やビルドコマンド、テストコマンドなどの設定は、YAML形式で記述します。設定ファイルは「.circleci/config.yml」です。
主に「ジョブ」「ステップ」「ワークフロー」の要素で構成されています。
「ジョブ」は、実行環境を構築します。実行環境は、Dockerイメージや仮想マシンイメージなどの中から選ぶことが可能です。ジョブ内での具体的な処理は、「ステップ」で定義されたコマンドのリストに従って実行されます。「ワークフロー」は、複数ジョブの実行順序を定めたルールです。ワークフローを利用することで、ジョブのスケジュール実行や並列処理が可能になり、効率的なCI/CDパイプラインを構築できます。
AWS Codeサービス
AWS上でCI/CDを構築するには、CodeCommit、CodeBuid、CodeDeployの3つを組み合わせることで実現できますが、これらを統括するCodePipelineも必要です。
CodePipelineは、CodeCommitにコードがプッシュされたことを検知して自動でビルドやデプロイを実行します。このコードを検知する仕組みには、EventBridgeが使用されています。なお、AWSでない異なるリポジトリサービス(例えば、GitHubなど)と連携したい場合にはAWS CodeStarを利用することでスムーズな統合が可能です。
GitHub Actions
GitHub Actionsは、GitHubが提供するCI/CDサービスです。GitHubのリポジトリに対して、コードのプッシュといったイベントをトリガーに、GitHub Actionsで設定されているワークフローが自動実行されてビルドやテスト、デプロイの処理を行います。
ワークフローの設定ファイルは、「.github/workflows」ディレクトリに保存します。設定内容はYAML形式で記述。また、ワークフローは、1つのリポジトリに対して複数のワークフローを設定可能です。
ワークフローの中身は、主に「name」「on」「jobs」「 steps 」のブロックで構成されています。各ブロックの説明は次の通りです。
・「name」は、ワークフローの名前を定義します。
・「on」は、 トリガーとなるイベント(例えば、pushやpull request)を定義します。
・「jobs」は、ワークフロー内で実行するジョブを定義できます。
・「steps」は、各ジョブ内で実行されるステップを定義します。ステップでは、コマンド実行やアクションの呼び出しが可能です。アクションとは、何かしらの処理をまとめたもので、自由に作成できます。
まとめ
CI/CDは、アジャイル開発と組み合わせることで、開発サイクルの高速化やコード品質の向上が期待できます。代表的なCI/CDツールには以下の特徴があります。
・Jenkinsは、オンプレミス環境で構築できるため拡張性に優れています。
・CircleCIは、SaaS型でインフラ管理が不要なため運用コストを削減できます。
・AWS Codeサービスは、他のAWSサービスと組み合わせて利用できるため、拡張性と連携のしやすいことが強みです。
・GitHub Actionsは、GitHubと親和性が高く、GitHubに対してワークフローからトリガーとなるイベントを定義して実行できる点が優れています。
それぞれの特徴を活かして、最適なCI/CDパイプラインを選定することで、開発サイクルの高速化や品質向上を実現していきましょう。
