Rubyのバージョンを最新版にアップグレードした話

こんにちは、YOUTRUST Webエンジニアの寺井(YOUTRUST/X)です。

今回、YOUTRUSTで使っているRubyのバージョンを 3.2.4 から 3.3.4 (執筆当時の最新版)にアップグレードしたので、その過程を記事にしたいと思います。

1. 非互換な変更点の確認

まずは、Ruby 3.2 から Ruby 3.3 への変更点を調べました。

主に上記の記事を参考にして、互換性に関する変更点について、YOUTRUSTのプロダクションコードで影響がないかを確認していきました。

1.1 it という名前のメソッド呼び出しが行われていないこと

Ruby 3.4 ではデフォルトのブロックパラメータにitが導入される予定のため、Ruby 3.3 でitというメソッドが呼び出されていると警告が出るようになります。

プロダクションコードで検索して、メソッド名としてitが使われていないことを確認しました。

1.2 Time.newの引数に不完全な文字列を渡していないこと

Ruby 3.3 からは、以下のようにTime.newに渡す引数の制限が少し厳しくなりました。

# 日と時間の情報がない
Time.new('2024-07')
#=> no time information (ArgumentError)

# 時間の情報がない
Time.new('2023-07-16')
#=> no time information (ArgumentError)

Ruby 3.2 までは上記のような場合でもエラーが発生せずにパースできていたため、上記のような呼び出しがされている箇所がないかをTime.newで検索して調べ、問題ないことを確認しました。

1.3 Refinement#refined_classが使われていないこと

Ruby 3.2 で追加された Refinement#refined_class が、Ruby 3.4 からは使えなくなる予定のため、Ruby 3.3 から警告が出るようになりました。

YOUTRUSTでは Refinement#refined_class は使用されていなかったため、問題ありませんでした。

1.4 lambdaメソッドをlambda { ... } 以外の形式で利用していないこと

-> {...}lambda { ... } 以外の形でProcオブジェクトを作成する場合、エラーが出るケースが増えたようなので、YOUTRUST内でlambdaが特別な記法で使われていないかを調べ、該当箇所がないことを確認しました。

1.5 特定のライブラリをGemfileへの追加なしにrequireしていないこと

Ruby 3.3 では将来的にbundled gemに移行される予定の標準ライブラリを、Gemfileへ追加なしにrequireすると警告が出るようになりました。

  • base64
  • csv
  • nkf

YOUTRUSTでは上記のライブラリがGemfileへの追加なしにrequireされていたため、明示的にGemfileに追加しました。

2. build時に発生した問題

次に、実際にRubyのバージョンを 3.3 に設定してbuildしたところ、gemの依存関係で以下のエラーが発生しました。

nokogiri-1.14.5-aarch64-linux requires ruby version >= 2.7, < 3.3.dev, 
which is incompatible with the current version, 3.3.0.rc1

YOUTRUSTでは後述するある経緯があってnokogiriのバージョンを1.14.x系に固定しており、これがRuby 3.3 にバージョンを上げるためのブロックになっているようでした。

2.1 nokogiriのバージョンを固定していた経緯

YOUTRUSTでは、例えばタイムラインへの投稿などにURLが含まれていたときにOGPを表示しています。

このOGP表示を実現するためにopengraph_parserというgemを使用しており、このopengraph_parserはnokogiriと依存関係がありました。

以前(2023/5/29)、nokogiriのバージョンを1.15.x系に上げたことが原因でOGPの表示が文字化けする問題が発生しました。

OGPで文字化けが発生

問題が発生した当時、すでにnokogiriのリポジトリには該当のissueが立てられていたため、解決されるまでnokogiriのバージョンを固定することで問題の発生を回避していました。

2.2 対応した解決策

しかし、修正が入ったnokogiri 1.16.2にバージョンを上げても問題が解決されなかったことと、gem opengraph_parserのメンテナンスが2年以上されていなかったこともあり、opengraph_parserを剥がすことにしました。

具体的には、OpenGraphクラスを自前で定義し、これまではopengraph_parserが担っていた「取得したHTMLからogに関するメタデータを取得する処理」をOpenGraphクラスのメソッドとして実装しました。

こうしたことによって、gem opengraph_parserを剥がし、nokogiriのバージョン固定を解除して最新版に上げることができました。

3. Rubyのアップグレードと今後の展望

これでRubyを3.3に上げる準備がすべて整ったので、実際にRubyのバージョンを3.3に設定してbuildを行い、テストがすべて通ることを確認して、sandbox環境で手動での動作確認を行って本番反映しました!🎉

今回、YOUTRUSTで使っているRubyのバージョンを執筆当時の最新版である3.3.4にアップグレードしましたが、Railsのバージョンはまだ7.0.8.4で最新の7.1系ではありません。

また、YOUTRUSTではまだYJITを有効化できていないので、今後はRailsのアップグレードとYJITの有効化にも取り組んで、次回はパフォーマンス向上の計測結果を記事にしたいと考えています。

4. 最後に

YOUTRUSTでは、今回アップグレードしたRubyや、フロントエンドで採用しているTypeScriptのバージョンも最新となっています。

YOUTRUSTで採用している技術スタック

私は個人的に、技術的負債の解消や開発者体験の向上といった分野に関心があり、日々のパッチバージョンアップがメインではありますが、この1年間で400回近く各種ライブラリのバージョンアップを行ってきました。

また、YOUTRUSTの開発組織全体で常にリファクタリングを行う文化も定着しており、開発しやすい環境が整っていると思います。

開発のしやすさという観点ではとてもおすすめできる環境なので、もしご興味があるからはぜひ応募、カジュアル面談をお待ちしております!

herp.careers