ITエンジニアによるITエンジニアのためのブログ

Ruby on RailsのRubyバージョンを3.0から3.1へ更新する方法

Ruby on Railsアプリケーションにおいて、Rubyバージョンを3.0から3.1にアップデートする方法を解説します。

なお、このバージョンアップデートを行なうには、Railsのバージョンは6.1以上である必要があります。Rails 6.0は、Ruby 3.1以降の psych gem(YAMLパーサー用ライブラリー)に対応しておらず、データベース設定ファイルなどのYAMLファイルのロード時にエラーが発生してしまうためです。本記事は、Rails 6.1以上のバージョンを使用していることを前提とします。

目次

  1. Ruby 3.1 をインストールする
  2. Gemfile を更新する
  3. Dockerfile を更新する (Dockerを使用している場合)
  4. アプリケーション・テストコードを更新する
  5. ステージング環境にデプロイする
  6. 本番環境にデプロイする
  7. まとめ

1. Ruby3.1をインストールする

まず、ローカル環境にRuby 3.1系の最新バージョンをインストールします。ここではRVM(Ruby Version Manager)を使ってインストールする例を示しますが、rbenvやDockerなど、他のRuby実行環境管理ツールでも同様の手順で問題ありません。

# bash
rvm install 3.1.7

インストールが完了したら、使用するRubyのバージョンを3.1.7に切り替えます。RVMの設定によっては自動で切り替わらない場合もありますので、明示的に指定するか、バージョンを確認することをおすすめします。

# bash
rvm use 3.1.7
# または確認
ruby -v

2. Gemfileを更新する

アプリケーションのGemfileに記載されているRubyのバージョンを3.1.7に変更し、bundle installを実行します。

# Gemfile
ruby '3.1.7'

バージョンを変更したら、依存するGemをインストールします。

# Bash
bundle install

インストール後、rails consoleが正常に起動するか確認します。

# Bash
rails console

もしrails consoleの起動時に、Ruby 3.1で標準ライブラリから分離されたnet/smtpなどのGemが見つからない旨のエラー(LoadError: cannot load such file -- net/smtpなど)が出るようであれば、以下の3つのnet系gemをGemfileに追加してください。これらのエラーは、Rails 7.0などRuby 3.1+に公式に対応しているバージョンでは解消されていますが、Rails 6.1などでは手動での追加が必要な場合があります。

# Gemfile
gem 'net-smtp', require: false
gem 'net-pop', require: false
gem 'net-imap', require: false

Gemfileを編集したら、再度bundleコマンドを実行してGemをインストールします。

# bash
bundle

3. Dockerfileを更新する (Dockerを使用している場合)

もし開発環境やCI/CDでDockerを使用している場合は、DockerfileのベースイメージをRuby 3.1.7に変更します。

# Dockerfile
FROM ruby:3.1.7

Dockerfileを更新したら、コンテナを再構築します。docker-compose.ymlなどでイメージを指定している場合も、合わせてバージョンの変更が必要か確認してください。

# docker compose (v2以降) を使っている場合のコンテナ再構築例
docker compose build [サービス名]

# docker-compose (v1) を使っている場合のコンテナ再構築例
# docker-compose build [サービス名]

# 単体で docker build している場合
# docker build -t your_image_name .

4. アプリケーション・テストコードを更新する

次に、アプリケーションやテストコードでRuby 3.1に対応していない箇所を更新します。

Ruby 3.0と3.1の間では、文法に後方互換性のない大きな変更は少ないですが、一部のメソッドの挙動変更や非推奨化、新しい機能の追加などがあります(例: Hash#exceptの削除、右代入構文の追加など)。詳細はRuby 3.1 リリースノートなどを参照することを推奨します。

コードの変更が不要な場合でも、念のためアプリケーションをローカル環境で起動し、主要な機能を手動でテストすると共に、RSpecやMinitestなどの自動テストを実行して全てのテストがパスすることを確認します。

5. ステージング環境にデプロイする

ローカル環境での確認が終わったら、ステージング環境にデプロイできるか確認します。

デプロイツールやCI/CDパイプラインの設定によっては、Rubyバージョンの指定箇所を変更する必要があるかもしれません。

もしデプロイ中にエラーが発生した場合は、デプロイログやアプリケーションログを確認して原因を特定し、修正を行います。

デプロイが成功したら、ステージング環境でアプリケーションのクリティカルな箇所を手動でテストし、エラーになる箇所があったら修正します。

6. 本番環境にデプロイする

ステージング環境でのテストが成功したら、本番環境へのデプロイを行います。手順はステージング環境へのデプロイと同様です。

デプロイが成功した後も、これまでのテストで見落としている箇所がないか、再度クリティカルな箇所を手動でテストすることをおすすめします。また、デプロイ後の数日間は、エラー監視ツールなどでのアプリケーションのエラー発生状況を特に注意深く監視するようにしましょう。

7. まとめ

Ruby 3.1へのバージョンアップは、使用しているRailsのバージョン(特にRails 6.1以前)によっては、依存するGemの互換性や標準ライブラリの分離などにより、いくつかの対応が必要になる場合があります。本記事で紹介した手順や注意点を参考に、慌てずに慎重にバージョンアップ作業を進めてみてください。