スマホのアプリって、しょっちゅうアップデートが来ますよね。あんなに頻繁に出して大丈夫なんですか?
いいところに気づいたね。速く出すのに、ちゃんと動く。それを実現するための考え方が DevOps(デブオプス)と、それを支える CI/CD なんだ。
開発と運用の「壁」
システムに関わるチームは、大きく2つに分かれます。
- 開発チーム(Development):新しい機能を作る。お客さんのためにどんどん変えたい
- 運用チーム(Operations):システムを毎日動かし続ける。トラブルを避けるためなるべく変えたくない
どちらも正しいのですが、目標が逆向きなので対立しがちです。その結果、「リリースは年に数回、しかも毎回トラブル」ということになりがちでした。
レストランにたとえると、開発は厨房、運用はホールです。厨房は新メニューを次々に出したい。ホールは注文ミスやお客さんの混乱を避けたい。両者が毎日話し合い、「新メニューは少しずつ出して、お客さんの反応をすぐ厨房に伝える」仕組みにすれば、新しさと安定を両立できます。
DevOpsとは
DevOps は、開発(Development)と運用(Operations)を組み合わせた言葉です。開発チームと運用チームが密接に協力し、ツールによる自動化を活用して、ソフトウェアを素早く・頻繁に・安定してリリースし続けるための考え方や取組みを指します。
DevOpsの主な特徴は次のとおりです。
- 小さく、頻繁にリリースする:一度に大きく変えるより、問題が起きても原因を見つけやすい
- 自動化する:ビルド(プログラムを動く形にまとめること)、テスト、本番環境への反映(デプロイ)などを人手ではなくツールで行い、ミスと手間を減らす
- 監視して、すぐ改善する:本番での動きや利用者の反応を開発にフィードバックし、次の改善につなげる
サーバなどの環境の設定もプログラムのように記述して自動で構築する IaC(Infrastructure as Code)も、DevOpsでよく使われる手法です。
アジャイル開発と似ている気がします。
考え方は近いね。アジャイルは主に「開発の進め方」の話。DevOpsはそこに運用まで巻き込んで、作ったものを本番に届けて動かし続けるところまでを速く回す考え方なんだ。
CI/CD ― DevOpsを支える自動化の仕組み
DevOpsを実現する中心的な仕組みが CI/CD です。プログラムの変更が本番環境に届くまでの流れを、ベルトコンベアのように自動化します。
CI(継続的インテグレーション)
CI(Continuous Integration)は、開発者が書いたプログラムを頻繁に(1日に何度も)共有の場所へ統合(インテグレーション)し、そのたびに自動でビルドとテストを行う手法です。
何人もの開発者が別々に作業し、何週間も後にまとめて合体させると、食い違いが大量に見つかって大混乱になります。こまめに合わせて毎回自動でテストすれば、問題を小さいうちに見つけて直せます。
カレーを作るとき、最後に一度だけ味見すると、まずくても直しようがありません。材料を入れるたびに味見すれば、「塩を入れすぎた」とすぐ気づけます。CIはこまめな自動の味見です。
CD(継続的デリバリー/継続的デプロイメント)
CD(Continuous Delivery/Continuous Deployment)は、CIの先まで自動化を広げたものです。CDには2つの意味があるので注意しましょう。
| 用語 | 自動化の範囲 | 本番環境への反映 |
|---|---|---|
| 継続的インテグレーション(CI) | 統合・ビルド・テスト | ― |
| 継続的デリバリー | CI + いつでも本番に出せる状態まで準備 | 人が判断してボタンを押す |
| 継続的デプロイメント | CI + 本番環境への反映まで | 自動(テストに合格すれば反映) |
デリバリー(delivery)は「配達」、デプロイ(deploy)は「配置・展開」。 デリバリーは「玄関先まで届けて、受け取るかは人が決める」、デプロイメントは「部屋の中まで自動で置いてくれる」とイメージしましょう。
似た用語との比較
| 用語 | ひとことで |
|---|---|
| アジャイル開発 | 短い期間で動くものを作り、改善を繰り返す開発の進め方 |
| DevOps | 開発と運用が協力し、自動化で素早く安定してリリースし続ける取組み |
| CI | こまめに統合し、自動でビルド・テスト |
| 継続的デリバリー | いつでも本番に出せる状態を保つ(本番反映は人が判断) |
| 継続的デプロイメント | 本番反映まで自動 |
「DevOps = 運用を外部に任せて開発に専念すること」ではありません。開発と運用が分かれたままではなく、協力するのがDevOpsです。
- DevOps = Development(開発)+ Operations(運用)。協力と自動化で、迅速なリリースと安定稼働を両立する
- CI(継続的インテグレーション) = 頻繁に統合し、そのたびに自動でビルド・テストして問題を早く見つける
- 継続的デリバリー = いつでもリリースできる状態を保ち、本番反映は人が判断
- 継続的デプロイメント = テストに合格したら本番反映まで自動
- アジャイルは「開発の進め方」、DevOpsは「運用まで含めた協力の仕組み」