# はじめに イタンジ株式会社でITANDI BBの開発をしているVO HUU DUC(ボ ヒュ ドゥック)です。
背景
ITANDI BBプロダクトは主にRailsを使って開発しています。ITANDI BBはRails 6.0でしたが、バージョンのEOLに伴ってRails 6.1まで上げました。
やったこと
やったRailsバージョンアップの手順
- テストのカバレッジを確認しました。カバレッジが約94%で、必要なテストはあると判断できたため、バージョンアップに際してはテストを追加しませんでした。
- developmentグループとtestグループのgemのバージョンを先に更新しました。
- その後、developmentグループとtestグループのgem以外、全てのgemのバージョンを更新しました。
- 「6.0系」のrailsバージョンの最新のバッチバージョンに更新しました。
- Railsバージョンを「6.1.7.6」に更新しました。6.1.7.6バージョンはアップグレードをした時点でのRails 6.1の最新のバッチバージョンです。
- 最後に、
rails app:update
を実行して、Railsのバージョンに依存する設定の更新をします。ここで注意することは、Railsのバージョンの変更により上書きされる設定があるので、差分を確認して必要に応じて設定をデフォルトから変えることです。
Railsバージョンアップの後にやったこと
- 更新されたgemを特定し、それぞれの標準設定について調べて、必要に応じて設定をしました。バージョンが更新され、デフォルト値が変更されることがあるので、アプリに必要な設定を詳しく調べて設定する必要があります。
- 参考:
発生したトラブルとその解決
トラブル1: Bullet gemが更新され、テストが落ちました。
- 原因:preloadやincludesを使う箇所に
Remove from your query: .includes
のようなエラーを発生しました。 - 解決:コードを確認した上で、該当のテストでBulletをdisableすることにしました。本番環境のデータ量を考慮すると、
includes
などを使う必要がある判断したので、該当のテストでBulletをdisableすることにしました。
- 原因:preloadやincludesを使う箇所に
トラブル2: carrierwaveを2.1.0から 3.0.3に更新して、extension_whitelistが非推奨になって、テストを実行するときに、警告メッセージが出ました。
- 原因:extension_whitelistが非推奨になりました。
- 解決: 非推奨警告に従って、extension_whitelistをextension_allowlistに変更し、警告メッセージを解消しました。
トラブル3: faraday gemが2.7.2から2.7.10に更新され, 以下のようにいくつかのwarningが発生しました。
warning: already initialized constant Net::ProtocRetryError
warning: already initialized constant Net::BufferedIO::BUFSIZE
warning: already initialized constant Net::NetPrivate::Socket
- 原因:faraday gemは、faraday-net_httpとnet/http gemに依存します。ただ、依存関係が明示されていなく、net-http gemが自動でうまくインストールされないことが原因です。
- 解決:gem 'net-http'を導入して、解決できました。
- 参考:
トラブル4:rails 6.0.6.1に更新して、テストを実行すると
DEPRECATION WARNING: Initialization autoloaded the constants ActionText::ContentHelper and ActionText::TagHelper.
が発生しました。- 原因:テスト環境には、config.cache_classes = trueに設定されていることが原因です。
- 解決:テスト環境で、config.cache_classes = false を設定して、解決できました。その理由は、
config.cache_classes
は、アプリにアクセスするたびにアプリケーションのクラスやモジュールをリクエストごとに再読み込みするか(=キャッシュしないかどうか)どうかを指定します。テスト環境では、キャッシュする必要がないからです。 - 参考:
トラブル5: rails 6.1.7.6に更新すると,
DEPRECATION WARNING: Rendering actions with '.' in the name is deprecated
が発生しました。- 原因:コントローラのテンプレート指定に拡張子をつけることが推奨されなくなりました。
- 解決:テンプレート指定の箇所から
.html.erb
の部分を消すことで解決できました。
他の参考記事:
- Rails アプリケーションを設定する
- Rails 6.1で新しく入る機能について
- 永久保存版!?伊藤さん式・Railsアプリのアップグレード手順
- Upgrade Rails from 6.0 to 6.1
- 7 Common Mistakes in Rails Upgrades
最後に
今回のRailsバージョンのアップデートをまとめました。