Ruby 3.3.6から3.4.1へのバージョンアップ
はじめに
シロクオンラインショップのRubyを3.4.1にバージョンアップしました。Ruby自体のバージョンアップはスムーズでしたが、予期しない問題に遭遇しました。本記事では、Ruby 3.4.1へのバージョンアップ時に遭遇した問題とその解決方法を共有します。
concurrent-ruby 1.3.5とRails7.0の互換性問題
Rubyのバージョンアップ自体とは直接関係ありませんでしたが、バージョンアップ後にプロジェクトを起動した際、以下のエラーが発生しました。
Unable to load application: NameError: uninitialized constant ActiveSupport::LoggerThreadSafeLevel::Logger
vendor/bundle/ruby/3.4.0/gems/activesupport-7.0.8.6/lib/active_support/logger_thread_safe_level.rb:12:in '<module:LoggerThreadSafeLevel>': uninitialized constant ActiveSupport::LoggerThreadSafeLevel::Logger (NameError)
Logger::Severity.constants.each do |severity|
^^^^^^
from vendor/bundle/ruby/3.4.0/gems/activesupport-7.0.8.6/lib/active_support/logger_thread_safe_level.rb:9:in '<module:ActiveSupport>'
調査の結果、concurrent-ruby 1.3.5でLoggerへの依存が削除されたことが原因でした。
この問題はRailsのissueでも報告されており、Rails 7.1では解決済みとのことです。
Rails 7.1にアップデートしない場合の対策
Rails 7.1にアップデートしない場合は、Gemfileに以下を追加してconcurrent-rubyのバージョンを固定します。
gem 'concurrent-ruby', '1.3.4'
この対応により、アプリケーションは正常に起動するようになりました。
日本語入力問題
Ruby 3.4.1へのバージョンアップ後、Rails console やIRBで日本語入力ができなくなる問題にも直面しました。
解決方法
一時的な解決策として、以下のコマンドでreadlineをロードしてコンソールを起動することで対応できました。(readlineがインストールされていることが前提です。)
RUBYOPT="-r readline" ./bin/rails c
irb -r readline
プロジェクト全体での対応策としては、Gemfileにreadline-extを追加しました。
gem 'readline-ext', '~> 0.2.0'
パフォーマンスの向上
Ruby 3.4.1へのバージョンアップ後、開発環境での画面遷移が速くなったことを体感できました。
YJITの最適化やPrismの導入による影響だと思われます。
まとめ
Ruby 3.4.1へのアップグレードは全体的には問題なく行えましたが、concurrent-rubyの変更によるエラーと日本語入力の問題に直面しました。これらの問題は適切なGemのバージョン固定とreadline-extの追加によって解決できました。
サービスも問題なく動作しています。
Ruby 3.4.1では画面遷移の速度向上などパフォーマンス面での改善も感じられ、十分にメリットを感じられるバージョンアップでした。
参考リンク:
Ruby 3.4.0 リリースノート
concurrent-ruby 1.3.5 リリースノート
Rails Issue #54260

「N organic」、「FAS」等の化粧品ブランドを展開している株式会社シロクのエンジニアブログです。 ECサイトを中心とした自社サービスの開発・運用を行っています。 sirok.jp/norganic
Discussion