はじめに
開発現場で使われる「CI/CD」について、最近学習したため備忘として記事にします。
・何となく聞いたことはあるけどよく分からない
・CIとCDの違いが曖昧
・実際にどう役立つのかイメージできない
といった初心者の方に読んでいただけますと幸いです。
CI/CDとは
「CI」と「CD」の2つのプロセスで構成されています。
CI (Continuous Integration : 継続的インテグレーション)
・開発者がコードを変更した際、自動的にビルドとテストを実行するプロセス
・バグの早期発見、コードの品質維持
CD (Continuous Delivery/Deployment : 継続的デリバリー/デプロイ)
・CIで合格したコードを、テスト環境や本番環境へ自動的に反映するプロセス
・リリース作業の自動化、迅速なサービス提供
メリット
・リリースサイクルの高速化
手作業を自動化し、数日かかっていた作業を数分~数時間で完了できる。
・バグの早期発見・修正
コードを統合するたびにテストが実行されるため、問題箇所を即座に特定できる。
・品質の安定
自動化されたプロセスにより人為的ミス(作業漏れなど)が減少し、一貫した品質が保たれる。
CIについて
CIに着目して見ていきます。
CI でやっていること
実機での動作テストは環境構築が難しいため、CIでは主に「静的解析」を行い、コードの品質を機械的に検査します。
・文法チェック : 構文エラーの検出
・コード品質チェック : 命名規則、複雑度、重複コードの検出
・セキュリティチェック : 脆弱性パターンの検出
CIの目的
・コード変更のたびに自動でビルド、テストを実行
・主に「静的解析」を中心に品質チェック
・実機テストは困難なため、文法チェックやコード品質の検証を自動化
・問題を早期に発見し、開発効率を向上
CI自動化のメリット
他にもいろいろあるかと思いますが、以下のようなメリットがあります。
機械的かつ確実な検査
CIによる自動化は、毎回同じ基準で一貫したチェックを実行します。
人間が見落としがちな細かいエラーも確実に検出し、コードの品質を維持します。
また、コードがコミットされるたびに自動で検査が走るため、問題の早期発見が可能になります。
人的ミスの減少と開発効率向上
手動でのチェック作業を自動化することで、人的ミスを大幅に削減できます。
開発者はコード品質の確認作業から解放され、本来の開発作業に集中できます。
早期に問題を検出することで、後工程での修正コストも削減されます。
エディタと解析ツールの連携
VSCodeの拡張機能を使えば、PythonやCloudFormationの文法チェックがリアルタイムで可能です。
Javaなどのコンパイル言語では、コンパイルエラーとして問題が検出されることも
あります。
CDについて
次はCDに着目していきます。
CDでやっていること
CIで検証されたコードを本番環境へ自動的に配布・リリースします。
配布方法には大きく分けて「Push型」と「Pull型」があります。
適切な手法を選ぶことで、安全かつ迅速なリリースが可能になります。
・Push型はサーバーから直接配布先へ送信する方式
・Pull型はクライアントが自らリポジトリから取得する方式
| Push型 | Pull型 | |
|---|---|---|
| 主体 | CI/CDツール | サーバ側のエージェント |
| 方向 | CI → サーバ | リポジトリ → サーバ |
| 主なツール | Jenkins, GitHub Actions | AWS CodeDeploy |
CD自動化のメリット
他にもいろいろあるかと思いますが、以下のようなメリットがあります。
小さな変更を頻繁にリリースできる
CDがないと、リリースは「まとめてドカッと」になりがち。
CDがあるとこまめにリリースでき、問題が起きても原因特定が容易にできます。
環境差異によるトラブルが減る
デプロイ手順がコード化されているため、以下の問題が解消されます。
・本番環境だけ設定が違う
・手順書が古くて再現できない
・担当者によってやり方が違う
ビジネス価値を素早く届けられる
技術的なメリットだけでなく、ビジネス面でも強力です。
・新機能をすぐユーザーに届けられる
・フィードバックを早く得られる
・改善サイクルが高速化する
CDの具体例
AWS環境を例にどのような流れでデプロイされるのか、図を用いて見ていきます。
どちらも主なデプロイ手法はBlue/Greenデプロイです。
デプロイ先がEC2である場合
①EC2インスタンスに「CodeDeployエージェント」をインストールする。
→S3上のアプリケーションファイル(ソース+appspec.yml)を指すCodeDeployデプロイ設定を作成
②CodeDeployAgentが、CodeDeploy(Manager)に対して常に情報を取りに行く。
→CodeDeployサービスにデプロイを指示
③EC2上のエージェントがS3からファイルをダウンロード。
④appspec.ymlに記述された手順(ファイルを置く、サービスを再起動するなど)に従ってデプロイを実行。
デプロイ先がEKSである場合
①CodeDeployが新しいコンテナイメージで新バージョンのコンテナのDeploymentを作成。
②CodeDeployが、K8sのサービス(Service)のトラフィック先(Selector)を、現行バージョンコンテナから新バージョンコンテナへ切り替え。
→ユーザーはダウンタイムなしで新しいバージョンへアクセスできるようになる
③新バージョンで問題がないか検証。
→問題があれば、自動的にトラフィックを現行バージョンに戻す(ロールバック)
→問題がなければ、古いバージョンを削除
おわりに
CI/CDはシステム開発ではほぼ必須の考え方です。
業務以外ではなかなか触る機会がないと思うので、これを機に理解しておくと便利かもしれません。
最後まで読んでいただきありがとうございました!

