デプロイ頻度を上げるための「下準備」
デプロイ頻度を上げた話ではなく、デプロイ頻度を上げるために必要なことを洗い出して実施したという話。
月 1 回のビッグバンリリース
所属チームは月 1 回のいわゆるビッグバンリリースで、まあ大変な状況だった。
- デプロイ作業は 2 時間超
- 500 ファイル以上の変更
- 「今月のリリースに間に合わせたい」ための行動が起きがち
Four Keys の話もあるし、列挙したチームの状況を鑑みても、デプロイ頻度を上げる価値はあると考えた。
いきなり毎日デプロイできるか? いいえ。
じゃあ月 1 回だったデプロイをいきなり毎日できるかというと、現実的ではない。今よりも大変になってしまうし、そもそも毎日デプロイするものもない。そんな状態で毎日デプロイしても価値は出ない。
まずは、デプロイ頻度を上げるための土台づくりが必要になってくる。 Four Keys はよくできているな… と感じる。
土台づくり
では、土台づくりで何をするか。ここの掘り下げは yigarashi さんの Four Keysがなぜ重要なのか - 開発チームのパフォーマンスを改善する方法について - yigarashiのブログ や 30分でわかるFour Keysの基礎と重要性 - Speaker Deck をめちゃくちゃ参考にした。その上で、チームの状況を見ながら以下の取り組みを行った。
プルリクエストを小さくする
デプロイ頻度を高めるには、デプロイする「モノ」を高頻度に生み出す必要がある。そのためには、プルリクエストを小さく分割し、高頻度にマージできるサイズになっていると良いはずだ。
チームでは、 Google Engineering Practices のコードレビューガイドラインを取り入れつつ、変更は最大でも 300 行以内という基準を設けた。
元々はコードレビューの遅さが嫌になって始めたものだが、巡り巡ってデプロイ頻度改善の下地にもなっている。
すばやくレビューする
チームではレビューを必須としているため、デプロイの高頻度化には素早いレビューも欠かせない。
これも Google Engineering Practices のガイドラインに従って 1 営業日以内のレビュー(またはレビュアー代打の提案)を行うようにした。また、別チームが開発したレビューリマインダー Bot を活用して、 1 日数回リマインドするようにした。
テストコードがない箇所は書く
例えばリファクタリングなら、 API の入出力が変化していないことを検証しておくと良い。シンプルに書くだけである。
一見、デプロイ頻度と無関係に思える。しかし、「高頻度にデプロイして大丈夫なんですか?」という不安に対する答えを用意しておくことは、意外と重要だと感じる。
カナリアデプロイを可能にする
万が一問題が発生したときの影響範囲を、可能な限り小さくしておく。
これもデプロイ頻度に直接作用するものではなく、不安を和らげる策の 1 つである。
素早いロールバックを可能にする
万が一問題が発生したときに、速やかに元に戻せるようにしておく。
これもやはり、高頻度なデプロイに対する不安を緩和するためのものである。
デプロイ作業を軽くする
これはデプロイ頻度に作用する。単純作業は自動化してしまえば良い。
ただ、チームには自動化までの道のりが長いプロセスもあった。具体的には、 QA (品質保証)と、受託開発でいう「受け入れテスト」相当のプロセス。
これについては、リファクタリングに限り、プロセスを思い切って省略することにした。
本来省略すべきものではないが、「事前に議論しても、リスクを取る選択はしづらいのでは」「一度やってみたデータがあるほうが、議論しやすいのでは」と考えた結果である。
試せる土台は整った
ここまでで、試しにデプロイ頻度を上げても良いと感じる程度には、土台は整ったと思う。
ひとり毎日デプロイ
単独で行っているリファクタリングのプロジェクトだけ、短期間毎日デプロイを試した。
思った以上に何も起こらなかった。
一度だけ不具合を起こしたが、原因を深掘りすると、従来のビッグバンリリースでも起きうる内容。カナリアリリースや素早いロールバックがプラスに働きそうだ。
あとはチーム次第
今後チームとしてデプロイ頻度が上がるかは、チーム次第。諸々の事情で遠巻きから見守ることになったので、本当にチーム次第である。
仮にデプロイ頻度が変わらなくても、それぞれの土台づくりが全く無駄になるわけではない。より高品質で、より安全なデプロイの一助になっているはずだ。