💨

Ruby 3.3.6から3.4.1へのバージョンアップ

2025/03/13に公開

はじめに

シロクオンラインショップの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

シロク エンジニアブログ

Discussion