22Inc.の開発チームが継続的なRailsアップデートを実現するためにやっていること
こんにちは、22Inc.大薮です。
弊社では、継続的なRailsアップデートをやっていくためにDependabotを導入しています。
今回はそんなRailsアップデートについて書きたいと思います。
Railsのアップデートやってますか?
Railsに限らずオープンソースを利用したプロダクトの開発・運用で避けて通れないのがフレームワーク・ライブラリのアップデートですよね。
でも、システムヘルスに関わる部分は、直接的には顧客価値の向上には繋がらないため開発優先度がどうしても下がってしまい、ついつい後回しにされがちです。
弊社もご多分に漏れずこんな感じでした...
なぜバージョンアップするのか?
エンジニア同士であれば、「常にアップデートしていかないとね〜」というのは、違和感のない会話として成立すると思いますが、
ビジネスサイドの人からすると、「なんでアップデートしないといけないの?安定して動いてるから良くない?」となったりするかもしれません。
全職種間 共通で通用する理由は、
「オープンソースソフトウェアを使うからにはアップデートし続けないと、継続的なセキュリティリスクの対処が困難になる。」
これにつきるんじゃないでしょうか?
例えば、最近、こんなリリースがありましたね。 weblog.rubyonrails.org
弊社は5.2だったので、その日のAM中には本番デプロイまで実施できましたが、 他社のエンジニアから、「Railsが4.1系でパッチが提供されなくて困った」、というような話はチラホラ聞きました。 (あるんですよね、ビジネス的には撤退モードだけどサービス提供は続いてて...でも開発コストはかけれない、みたいなの...ツライですね...)
余談ですが、個人的には、Rails5.2アップデート時は、ActiveModel::Attributes が利用可能になることが一番楽しみだったりしました。
(ActiveModel::Attributesの素晴らしさついては、また別エントリにて書きたいです。)
エンジニアなら、アップデートができないとそういった楽しさから取り残されていく感じになってツライのでモチベーションという意味でも最新版に追随していく意義は大きいですよね。
Dependabotでムリなく継続的なアップデートを実現
どんなサービス?
さて、弊社ではdependabotというサービスを導入しています。
一言でいうと、利用しているgemにアップデートがあったらバージョンアップのプルリクエスト作成を自動でやってくれる、というサービスです。
導入方法は?
導入作業はGithubアカウントでSignUpしてリポジトリを選択すれば、あとはGemのアップデートがあった場合に自動でプルリクエストが作成されるのを待つだけです。
プルリクエスト作成単位は?
Gemfileに記載のgem毎にプルリクエストが作成されます。
例に上げた先日のセキュリティアップデートの際は下記のようなプルリクエストが朝イチに作成されていました。
サクッとマージして本番デプロイしてあとから、脆弱性の重大さに気付くというぐらいでした。
どう運用するか?
ここに関しては、チームによって状況が異なるのでなんともいえないですが、こんな感じでしょうか?
- CIでテストが通っていることを確認
- メンバーがプルリクエストのChangeLogなどを確認してLGTM
- QA担当が動作確認
弊社ではCIがグリーンなことを前提にあとはChangeLogなどをみつつ、手動で確認した方がいいところがないかプルリクエスト上で議論し、必要に応じて動作確認をしたあとは、速やかに本番デプロイというサイクルがチーム内で習慣化してきています。
以前はまとめてアップデートしていましたが、これからはムリなくコツコツとアップデートして、システムヘルスは健全に保てそうです。