CI/CDとは
多くのサイトで、以下のように説明されています。
「 Continuous Integration(継続的インテグレーション)/ Continuous Delivery(継続的デリバリー)」の略称。CI/CDは、何か特定の技術を指すものではなく、ソフトウェアの変更を常にテストし、自動で本番環境にへ適用できるような状態にしておく開発手法のこと。
・・・・・つまり????(╹◡╹;)
いろんな解説を一周して、自分なりにわかりやすい捉え方はこちらになりました。
CI/CDとは、「リポジトリでの開発完了〜本番リリースのあいだに必要な、テストやらデプロイやらを自動化するもの」
こう言われると、何者なのかは理解できそうです。
CIとCDの棲み分けは?
「CI/CDとは」は何となく理解できたのですが、「CIとCDは何が違うの?」という疑問が残ります。それぞれの説明を見てみると、
CIとは...
継続的インテグレーションという名の通り、開発者にとっては自動化のプロセスを指す。アプリケーション開発で言えば、バラバラに稼働している複数エンジニアのソースコードを継続的に統合(インテグレーション)し、正常に動作することを確認するために検証する取り組みのことである。新たなソースコードの変更を、定期的に、あるいは毎日でもビルドおよびテストし、共通のリポジトリに統合する。
CDとは...
継続的デリバリーという名の通り、ユーザーに継続的にアプリケーションを提供することを指す。提供とはすなわち、本番環境にアプリケーションを載せ、顧客がいつでも新たなアプリケーションを利用できるようにすることである。CDでは、検証済みコードのリポジトリへのリリースを自動化する。コード変更のマージから本番環境に対応するためのビルドのデリバリーまで、すべての段階でテストとコードリリースを自動化する。これにより、運用チームは本番環境にアプリケーションをすぐにデプロイできる。
引用:https://www.sbbit.jp/article/cont1/81640
とあります(╹◡╹;)何となーくわかりそうですが、まだぼんやりしています。
具体的な状態で考えてみます。
CIのみ導入していたら
開発者がコードをプッシュ → テスト・解析を実行(CI) → 問題なければ「テスト成功」の通知 → デプロイとリリースは開発者が手動で行う
CI/CDの両方を導入していたら
開発者がコードをプッシュ → テスト・解析を実行(CI) → ステージングや本番環境へデプロイ(CD) → 自動リリース(CD)
といった感じになります。
CI(継続的インテグレーション)は、マージ~テストまでに重点を置き、変更を合体しても正常に動作することを確認する。
CD(継続的デリバリー)は、デプロイ〜リリースに重点を置き、より提供に近い箇所を自動化する。
つまり 「どこまで自動化するか」 というのが、CIとCDを分ける要素なのです。
CIはCDに含まれるという捉え方もある
CDはCIを拡張したものであり、CDがCIを含んでいるという捉え方もあります(デリバリーという概念に全てのフローを含むことができるため)。どちらの考え方が間違っているとかではないみたいです。いずれにしても、CIはマージ~テストまでに重きを置いた概念で、CDはデプロイ~リリースに重きを置いた概念であるという考え方は同じです。
CI/CD導入のメリット
- 正確なテストを行える。人間じゃないので設定さえ合っていればミスらない!
- 開発完了〜リリースまでのスピード大幅アップ。しかも人間の時間を使わない!
ツール
- Github Actions
- CircleCI
- Jenkins
- Bitrise
など。CI/CDを導入するためのツールは色々あるみたいです。
うちではGitHub Actionsを使っていて、実際のワークフローの書き方の一例がこちらの記事で解説されています↓↓
詳しいワークフロー構文はGitHub Docsがとても親切でわかりやすいです↓↓
参考
https://www.ctc-g.co.jp/solutions/cloud/column/article/104.html
https://www.sbbit.jp/article/cont1/81640