fv17の日記

Webエンジニアの備忘用ブログです。主にWeb界隈の技術に関して書いています。

Railsのバージョンアップ方法

この記事は何?

Railsのバージョンアップ方法について

対象読者

  • はじめてRailsのバージョンアップをする方
  • Railsのアップデート方法を学びたい方

参考資料

大まかな手順

Rubyのバージョンを上げる

下記よりもRubyのバージョンが低い場合は、事前にRubyのバージョンを上げる

Rails 6: Ruby 2.5.0以降が必須です。
Rails 5: Ruby 2.2.2以降が必須です。

(引用元)公式ドキュメント

バージョンアップによる変更点の概要を知る

公式ドキュメントのリリースノートやチェンジログを読み、変更点の概要を知る
Rails 5.1からRails 5.2へのアップグレード などとまとめられている https://railsguides.jp/upgrading_ruby_on_rails.html

Railsのバージョンを上げる

- gem 'rails', '5.1.x.x'
+ gem 'rails', '5.2.x.x'

古いgemを洗い出す

Railsと依存関係にあるgemのうち、アップデート後のバージョンと依存関係が合わないgemを洗い出す

bundle update --conservative rails

Bundler could not find compatible versions for ...などとエラーが出る
gemが依存しているRailsのバージョンが古いとエラーになる

gemのUpdate

dependabotを使うなどして、エラーが出力されたgemのアップデートを行う
あるいは、Rails Updateのタイミングで利用するgemをすべて最新にするでもOK

(注意)
gemが特定のRailsのバージョンまでしか対応しておらず、保守運用されていないことがある
その場合は、updateしても解決しないためgemを使わないように対応が必要

設定ファイルの新規作成や変更

アップデート後のRailsに必要な設定ファイルや記述を作成する

rails app:update

新規作成されたり、既存ファイルに変更が入るため、差分をチェックして問題ないことを確認し、必要分を選択してマージする

※ バージョンアップ後のRailsで導入されたgemは自動で追加してくれないので、必要に応じて対応 railsdiff.orgを参考にして、新しく追加されたgem等を確認する

Railsをバージョンアップ

4.の手順だけではまだ新しいバージョンが反映されてない config/application.rbにある config.load_defaults で設定を変更

- config.load_defaults 5.1
+ config.load_defaults 5.2

エラーに対応する

(1) RSpecを実行すると大量にエラーが吐き出されるはずなので対応

バージョンアップすると様々な変更箇所が反映され、テストが失敗する
エラー内容、下記のChange logなどを確認しながら対応する
https://railsguides.jp/5_2_release_notes.html

(2) new_framework_defaults_x_x.rbで設定が変更された箇所を確認し対応

4.の手順でconfig/initializers直下に new_framework_defaults_5_2.rb といったファイルが新規作成される。このファイルにはバージョンアップで大きく挙動が変更される箇所の一覧が記載されている。

このファイルでは、下記ができる
- 仕様変更の確認
- 旧バージョンの挙動の引き継ぐ設定

内容を確認し、最新バージョンに対応させる、または旧仕様を引き継ぐことでエラー解消する。コメントアウトされているのは、バージョンアップ後の仕様で、旧バージョンの仕様を引継ぎたい場合はコメントアウトを外し、booleanの値を反転する必要がある。

new_framework_defaults_x_x.rb については下記が詳しい https://qiita.com/jnchito/items/cce3b2795e1c66735310

また、コメントアウトされている場合にも バージョンアップ直後は旧バージョンのままでの運用を推奨 などと書かれている場合もあるので注意が必要

最後にSTG環境で手動確認

最後は手で色々叩いて確認する
画面上でのログイン、主要機能に加えて、APIなども一通り叩いて確認
specの記載漏れや、情報がほぼないような箇所でコケてたりするので抜かり無く!

本番環境へデプロイ

多分エラーが出る
そのため、revertコミットを事前に準備するなどして緊急時にもすぐ戻せる万全の体制でデプロイ

5.2へのUpdateでハマった箇所、ポイント

CSRF対策(protect_from_forgery)がデフォルトでActionController::Baseに移行

# Add default protection from forgery to ActionController::Base instead of in
# ApplicationController.
# Rails.application.config.action_controller.default_protect_from_forgery = true

従来ApplicationControllerに設定されていた protect_from_forgeryActionController::Baseに移行された。APIのcontroller等でActionController::Baseを継承していたりすると落ちるため、ActionController::APIを継承したり、skip_before_action :verify_authenticity_tokenを足したりする対応が必要

Rails Updateに向けて普段から気をつけること

下記を普段から意識するとRails Updateがより簡単になる

  • Dependabotなどを導入し、gemのバージョンを最新に保つ
  • DeprecatedなどのWarningは、放置せずに対応する
  • gemを使う場合、保守運用されるものを使う
  • テストはしっかり書くべし

など