reona.dev

6.0.3.7 -> 6.1.4 へのアップグレード


はじめに

現在担当のプロジェクトにおいて Rails のアップグレードを行なったので、備忘録。

参考記事

公式ドキュメントに勝るものはないので、基本的にはアップグレードガイドを参考にした。

Rails ガイドにはマイナーバージョンごとに変更点や追加機能がとても詳細に記載されているので、必読。

さらに詳しく知りたい場合、今回であれば ActiveStorage 関連の変更がそこそこあったので、CHANGELOG も併せて読むことで変更点を整理した。

公式ではないが、チェリー本で有名な伊藤淳一さんの Qiita 記事も簡潔にまとまっており、参考にした。

手順

各手順を実施後にテストが失敗したり、新たな警告が出る場合は修正コミットを積む。 次の手順への移行前に必ず実際に動かしてみる。(原因を切り分けるため)

  1. テストがすべてパスすることを確認。
  • pending のテストケースが 44 件あったので、このタスクに取り掛かる前にすべて解消させた。
  • 放置されていた warning も少なからずあったため、事前に対応。
  1. bundle update -g development -g test で gem のパージョンを最新にする。
  • バージョンの指定は基本的に外す。
  • bundle outdated で最新ではない gem が一覧で表示される。
  1. bundle update で Rails 以外の gem を最新にする
  • webpacker が 4.0.7 であり、差分が大きくなりそうだったのと、今回のアップグレードに必須ではなかったため、別の PR に切り出した。
  • この時点でまずテストが走らない事態が発生。gem active_interaction のメジャーバージョンが変わったことによる仕様変更が直接的な原因。
    • 該当箇所を修正後、他に 257 件のテストケースが失敗。既存コードの使い方が間違っていたが、gem の仕様が厳格になったことで間違っている箇所が一斉にパスしなくなった。
    • gem の Changelog, メジャーアップグレードの PR の File Changed でどのコードの変更が影響しているのか模索しつつ、1 つ 1 つ修正。
  1. Rails のパッチバージョンを上げる。テストがパスすることの確認。
  • 6.0.3.7 -> 6.0.4 の変更。
  1. 次のマイナーバージョンの最新パッチに移行。
  • 6.0.4 -> 6.1.4 の変更。
    • マイナーバージョンが上がると warning 増えたので対処。
  1. rails app:update を実行。
Overwrite /project/config/application.rb? (enter
  - h for help) [Ynaqdh]
  • 以上の表示が繰り返されるので、基本的には d で Diff を確認し、 Y で上書き実行。
    • コマンド完了後、上書きされたファイルを再度 Diff を見ながら手直しで修正。
    • Rails Diff というサイトがあり、特定バージョン間の差分を確認することもできるので便利。
  1. 最後に開発環境・デモ環境で動作確認。できれば複数人にレビューを受ける。

最後に

  • gem は便利なものが多い一方で、今回は密結合になっていたために対応に非常に苦労した。一長一短。

  • グレードアップによる差分は非常に大きくなる可能性があるので、状況に応じて適切な粒度で PR を分割したほうがよさそう。(今回 Webpacker のアップグレードは別 PR に分けた)

    分割することによって逆にレビュアーが混乱するケースもあると思うので注意が必要。

  • rails app:update はプロジェクトの設定ファイルが結構書き換わるので慎重に。レビューを念入りに頼むのも good

  • 大変なタスクだったけど、自分でタスクを取りに行なって本当によかった。

    • 使われてる gem の仕様の理解がかなり深まったし、Rails やプロジェクトへの理解も深まった。
    • 自分の中の OSS のコードを読みにいくハードルが下がった。
    • テスト時や yarn install 、各サーバー起動時のログなどの warning が格段に減って綺麗になった。
  • Rails ガイドをはじめ、多くの情報がわかりやすくまとまった記事を複数参考にさせていただいたので、とてもありがたい…🙏

フレームワークやパッケージのアップグレードは優先度がそこまで高く見積もられない傾向にあるが、プロダクトを継続的に改善していく上では避けて通れないし、早めに取り組んだほう受ける恩恵も多いだろうなと実感した。