207 Tech Blog

テクノロジーで物流を変える 207 (ニーマルナナ) 株式会社のテックブログ

Rails 6.0系にアップグレードする

この記事は 207 Advent Calendar 2022の記事です。

qiita.com

こんにちは。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バージョン

  • Rails6ではRuby2.5.0以降が必須になるので条件を満たしてない場合はRubyのバージョンアップを実施して下さい。207では事前に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 になりました。

railsguides.jp

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をご覧ください!

207-inc.super.site