ざっくり理解するシリーズ「CI/CD」
CI/CDとは?
CI=「継続的インテグレーション」
CD=「継続的デリバリーまたは継続的デプロイ」
の事で、ソフトウェア開発手法の1つです。
どういう事?
例えばWebシステムを開発しているとします。
新機能をリリースする際、テストを実施してOKだったらサーバーに展開していきます。ですがこのテスト実施とデプロイというのは結構時間がかかります。また毎回コマンドでテスト実行したりデプロイしていくと間違いも発生してしまいます。本番環境デプロイ失敗とか考えたくないですね。
また大規模な機能を実装していてテストをしている時に以前はOKだったテストがNGになったとか、全然関係ない所のテストがNGになったりするとどこの変更が原因なのかが掴めなくなります。
細かくテスト、細かくリリース
そこで、機能をリリースする時ではなく普段の開発の時から継続的にテストを実施して、NGになったらすぐに気づけるようにしておけば原因箇所の特定も簡単になります。
これは「アジャイル開発」とも相性が良く、一緒に取り込まれる事が多いです。このように継続的にインテグレーション(統合)してソフトウェア動作を継続的に確認する事で品質を担保する事ができます。
また継続的デリバリーもセットで行う事で「バグ1つ修正」とかのレベルで顧客に価値を提供する事ができるようになるので、CI/CDとセットで用いられる事が多いです。
「テスト」と「デプロイ」を1つのパイプラインで繋ぎ、GitでコミットしてPushする度に実行するように設定する事が多いです。
「細かくリリースできる」という価値
CI/CDを導入する事で不具合の早期発見やデプロイ方法の共有ができるようになりますが、他に得られる価値として「細かくリリースできる」という事。
普段は時間をかけてテストやデプロイを行いますが、それがGitにPushするだけで自動で行われるという事は、それだけ早くリリースが可能という事です。つまり顧客から「○○という不具合があるんだけど直してくれない?」って言われてから、不具合が直ったシステムを顧客が使えるようになるまでの時間が短くなるという事です。
自分が使っているサービスで不具合が出て、問い合わせても中々直してくれないとイライラするかと思いますが、すぐに直してくれると好印象を持ちますよね。機能追加とかではありませんが、これも立派な付加価値だと思います。
むしろ現在の市場を考えると「リリース速度」や「リリース頻度」はかなり重要です。
開発者にもメリットがあり、コミットレベルで毎回テストが実行されるのでNGが出たらすぐに気づけます。なので「この部分変更したら他に影響ありそうで怖い」とかを考える事なくガンガンコミットできます。
サービス
- Github Actions
- CircleCI
- Jenkins
代表的なものはこんな感じでしょうか。あとは各パブリッククラウドサービスでもCI/CDを展開できるサービスも存在しています。
ちなみに、もしGithub Actionsを使うなら、最初はパブリックリポジトリで練習してからプライベートリポジトリに移行するのがおすすめです。プライベートリポジトリは1ヶ月あたりに利用できる時間が限られているので、最初からプライベートリポジトリでガンガンActionを試していたりするとすぐに枯渇します。パブリックリポジトリであれば無料なので気にする事なく試行錯誤できます。
Discussion