0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

CI/CDを基礎から学ぶ

0
Posted at

はじめに

開発現場で使われる「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に記述された手順(ファイルを置く、サービスを再起動するなど)に従ってデプロイを実行。

image.png

デプロイ先がEKSである場合

①CodeDeployが新しいコンテナイメージで新バージョンのコンテナのDeploymentを作成。

②CodeDeployが、K8sのサービス(Service)のトラフィック先(Selector)を、現行バージョンコンテナから新バージョンコンテナへ切り替え。
 →ユーザーはダウンタイムなしで新しいバージョンへアクセスできるようになる

③新バージョンで問題がないか検証。
 →問題があれば、自動的にトラフィックを現行バージョンに戻す(ロールバック)
 →問題がなければ、古いバージョンを削除

image.png

おわりに

CI/CDはシステム開発ではほぼ必須の考え方です。
業務以外ではなかなか触る機会がないと思うので、これを機に理解しておくと便利かもしれません。

最後まで読んでいただきありがとうございました!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?