この記事は 207 Advent Calendar 2022の記事です。
こんにちは。207 でソフトウェアエンジニアをやっている原口 (id:nagamejun)です。 207ではバックエンドにRuby on Railsを使っています。2022年7月にRails6にアップグレードしたのでその手順を共有したいと思います。
動機
Rails7.0がリリースされたことに伴い、Rails 5.2.Zがサポート対象シリーズのリストに含まれるのは、2022年6月1日までになりました。そのため早めにRails6にアップグレードする必要があります。
事前準備
Rails アップグレードガイド を参考に準備をします。
1 テスティングのカバレッジ
- 207のテストカバレッジは98%をキープしているのでこちらの作業は不要でした。
2 Rubyバージョン
アップグレード手順
Rails5.2.8 にバージョンを上げる
一旦5系の最新バージョンのRails5.2.8にアップデートします。 ポリモーフィック周りのActiveRecordの挙動が5.2.4で変わった(symbol)部分でエラーでが出たので該当のgemをアップデートしました。
Rails6 にバージョンを上げる
Gemfileに記載されているRailsのバージョンを編集
gem 'rails', '6.0.5.1'
updateの実行をします。
bundle update rails
Gemのdependenciesを解決します。
アップデートタスクを実行します。
bundle exec rails app:update
対話形式でconfigファイルを上書きするか聞かれるので上書きします。
大きく変更となるconfigはconfig/initializers/new_framework_defaults_6_0.rb
によってoffにされてるので変更点は最小限となります。
DEPRECATION WARNING を直す
対応したDEPRECATION WARNING
DEPRECATION WARNING: Class level methods will no longer inherit scoping from `create!` in Rails 6.1. DEPRECATION WARNING: Class level methods will no longer inherit scoping from `filter_by_company` in Rails 6.1. DEPRECATION WARNING: NOT conditions will no longer behave as NOR in Rails 6.1. DEPRECATION WARNING: Dangerous query method (method whose arguments are used as raw SQL) Deprecation Warnings: Using `stub` from rspec-mocks' old `:should` syntax without explicitly enabling the syntax is deprecated.
オートローダーについて
Rails 6.0 からはオートローダーが Zeitwerk になりました。
config.load_defaults 5.2 のままなので Zeitwerk の対応はとりあえず後回しにします。
DNSリバインディング攻撃からの保護について
ブラウザにアクセスした時に下記のようなエラーが表示されました。
Blocked host: hogefuga-piyo.com To allow requests to hogehoge-host.com, add the following to your environment configuration: config.hosts << "hogefuga-piyo.com"
Rails 6 から追加された、DNSリバインディング攻撃を防止する ActionDispatch::HostAuthorization middleware のものの影響のようです。
こちらの記事にある通り Rails6でBlocked hostエラーが発生した時の対処法
ActionDispatch::HostAuthorization middleware を使わないようにconfig/application.rb
を修正します。
module HogeApp class Application < Rails::Application # LB等で対策するため、アプリケーションではHostヘッダーをチェックしない config.middleware.delete ActionDispatch::HostAuthorization end end
テストとQA
Rspecを実行します。 Unit Testで担保されている以外の部分はQAでの検証を実施します。
まとめ
上記でRails6系にアップグレードする最小の作業だと思います。問題なければアップグレード作業はこれで完了になります。 Railsアップグレードのような全体に影響があるような作業はテストカバレッジが重要です。 207では前述の通りテストカバレッジが98%をキープ出来ているのでスムーズに作業を進めることが出来ました。
いつもの
207株式会社では、レガシーな物流業界の変革に挑む配達員向け効率化アプリ「TODOCUサポーター」を開発しています。 フロントエンド、バックエンドの開発をしたいメンバーを大絶賛募集中です!
もし少しでもご興味がありましたら以下のnotionをご覧ください!