見出し画像

HANOWAのRubyを2.7から3.3に、Railsを6.1から7.1にバージョンアップしました

こんにちは。HANOWAエンジニアの榎本です。

今回はHANOWAのRubyを2.7から3.3に、Railsを6.1から7.1にそれぞれ最新のバージョンにバージョンアップしたことを紹介します。


背景

HANOWAではバックエンドにプログラミング言語としてRubyを使用していましたが、バージョンが2.7とすでにEOLを迎えていたバージョンを使用しており、バージョンを上げないとまずいということになり、バージョンアップ対応をすすめることになりました。
https://www.ruby-lang.org/ja/downloads/branches/

Railsに関しては6.1を使用しており、まだEOLは迎えていませんでしたが、今回のタイミングでRailsも最新のバージョンにあげることとしました。

移行プロセス

1. 使用していないgemをGemfileから削除

Gemfileの中に使用していないgemが何個かあったので削除しました。

HANOWAでは、wheneversucker_punchがもう使用されていないもののGemfileに記述されたままになっていたので記述を削除しました。

2. Gemfileのバージョン指定を削除

このあとgemを一括で最新版にアップデートするので、Rails以外のgemは事前にバージョン指定を削除しました。

- gem "devise", "4.8.1"
+ gem "devise"

3. developmentとtestグループのgemをアップデート

bundle update -g development -g test

を実行して、developmentとtestグループのgemをアップデートしました。

HANOWAではRubocopを使用しているため、アップデート後に自動整形し、手動で修正しなければならないところのみ対応しました。

また、Rspecの仕様変更の影響で、Rspec実行時にエラーが出力されるようになったため下記ファイルも修正しました。

  • config/environments/test.rb

- config.cache_classes = true
+ config.cache_classes = false

※ HANOWAではこの時点で1度mainブランチに反映しました

4. RubyとRailsのバージョンをあげる

RubyとRailsのバージョンをあげます。

このとき、railsdiffを参照しながら、差分の取り込みも行いました。

  • Dockerfile

- FROM ruby:2.7.5-slim
+ FROM ruby:3.3.0-slim
  • Gemfile

- gem "rails", "6.1.4"
+ gem "rails", "7.1.3.2"

+ gem "sprockets-rails"

- gem "byebug"
+ gem "debug"
  • app/models/application_record.rb

class ApplicationRecord < ActiveRecord::Base
-  self.abstract_class = true
+  primary_abstract_class
  • config/application.rb

-   config.load_defaults 6.1
+   config.load_defaults 7.1

5. 動作確認しエラーを修正する

Rspecを実行したり、Railsを起動し動作確認をしてエラーを修正していきました。

  • Gemfileに記述追加
    Ruby 3.4から標準ライブラリから除外されるgemのアラートが出ていたので、Gemfileに記述を追加しました

+ gem "csv"
+ gem "nkf"
  • ハッシュをキーワード引数として明示的に渡す
    Ruby 3.0以降、ハッシュをそのままキーワード引数として渡すとエラーになるようになったので修正しました

def foo(k: 1)
  p k
end

h = { k: 42 }

- foo(h)
+ foo(**h)

移行後の状況と今後の展望

リリース後は特に問題も発生せずに稼働しています。

また、AWSのECS on Fargateを利用しているのですが、リリース後にメモリ使用率が下がるという恩恵も受けることができました。

リリース前後のメモリ使用率の変化

(Ruby 3.0が出てすぐの時はすごく苦労した記憶がありましたが、)今回のバージョンアップは全体で2週間くらいと非常にタイトなスケジュールで実施しましたが、大きなバグも発生せずスムーズに進捗することができました。

今後はバージョンアップを継続的に実施していく運用の整備を行なっていき、またRails 7.2からデフォルトとなるYJITの有効化も検討していきたいと思います。

HANOWAでは他のメンバーもnoteを書いているので、ぜひ見に行ってみてください!

この記事が気に入ったらサポートをしてみませんか?