MAGAZINE

ルーターマガジン

Ruby

Rubyバージョンのアップデート備忘録(2.4.3 to 2.7.7)

2023.03.03
Pocket

はじめに

rooterのエンジニアとして開発を行っております、宮本です。今回、プロジェクト内のリポジトリで、Rubyのバージョンを大きく更新したため、そのステップをブログとして残します。

今回変更を加えたリポジトリは開発当初からバージョンを引き継いだままでしたが、機能拡張のためのgem導入で2.6以上へのアップデートの必要が生じ、マイナーバージョンを3つあげることになりました。

アップデート方法

何をしたのか

  1. リリースノートの確認・アップデート先の決定
  2. ブランチを切る
  3. 更新前にテストを回す
  4. Rubyをインストールする
  5. 各種設定ファイルの書き換え
  6. gemの更新
  7. 更新後にテストを通す
  8. 自動テストを通す
  9. 動作検証

1. リリースノートの確認・アップデート先の決定

本作業は、2022年12月初頭に行ったため、アップデート先の候補は以下の3バージョンでした。

  • 3.1.3
  • 3.0.5
  • 2.7.7

リリースノートやリポジトリ内での使用メソッド・gemとの関係をふまえ、今回は2.7.7へのアップデートを決定しました。

2. ブランチを切る

開発用にブランチを切りました。処理系のアップデートは事故が起こりやすいので、ちゃんと元に戻せるようにしましょう...

$ git checkout -b update-ruby-2.7.7

3. 更新前にテストを回す

更新によって生じたテスト落ちを判別するため、アップデートの前に一度テストを流しておきました。弊社では、テストフレームワークとしてRspecをよく使っています。テストが作り込まれているかどうかは、楽に事故なくアップデートを遂行するのに重要な要素ですね。

4. Rubyをインストールする

rooterでは、Rubyのバージョン管理にrbenvを利用しています。そこで、rbenvでバージョン2.7.7のRubyをインストールしました。また、rbenvとruby-buildのバージョンが古く、インストール可能なリストになかったため、それらの更新も行いました。

# インストール可能なruby versionの確認
$ rbenv install --list

# もしリストに対象のバージョンがなければ
# Ubuntuやwslなどで直接管理している場合(aptで入れたrbenvは最新のものになっていません)
$ cd ~/.rbenv
$ git pull
$ cd ~/.rbenv/plugins/ruby-build
$ git pull
# macのbrewで管理している場合
$ brew upgrade rbenv ruby-build

# rubyのインストール(2.7.7)
$ rbenv install 2.7.7

長いrbenv installが終わったら、rbenv versionsを叩いて、目的のバージョンがきちんとインストールされているかを確認しましょう。

5. ruby-versionの書き換え

# .ruby-version
- 2.4.3
+ 2.7.7

変更後に、次のコマンドを対象ディレクトリに移動して叩けば、アップデート先のバージョンが出力されるのを確認してください。

$ ruby --version

6. gemの更新

結論から記すと、今回は以下のコマンドでgemの更新を行いました

$ gem update bundler
$ bundle update

一般に、Rubyのバージョンアップデートと、gemのアップデートを同時に行うのは危険とされます。しかし今回はバージョンアップの幅が大きいので、以降行う動作テストを実行するためにもgemの一括アップデートを行いました。

7. 更新後にテストを通す

3ステップ目と同様にして、テストを実行します。実行を通して、エラーを見つつ変更のあったメソッドなどを修正していきます。

今回のアップデートに伴い修正したメソッドをいくつか紹介します。

  • ActiveRecord::Result.to_hash
    • ActiveRecord::Result.to_aに変更
    • to_hashと言いながら、Arrayを返していたため、Rails6から名前が変わり、to_hashには警告が出るように
  • ActiveRecord::Base.default_timezone
    • ActiveRecord.default_timezoneに変更
  • CSV.read(path,'r:BOM|UTF-8')
    • CSV.read(path,encoding:'BOM|UTF-8')に変更

など...

8. 自動テストを通す

rooterでは、bitbucketのCI,pipelinesを使って自動テストを行なっています。

ここでは、自動テスト用のdockerイメージの更新と、pipelinesのconfigファイルの修正を行いました。主な変更は次の2点です

  • dockerのベースイメージのRubyのバージョンを変更
  • configファイル中のbundlerのバージョン指定を上げる

9. 動作検証

作業の前後でシステムの仕様に変化がないかをチェックしましょう。自動テストが甘い場合は、このステップを念入りにすることが大切です...

最後に

処理系のアップデートというのは、かなり腰の重い作業ではありますが、速度面や使えるライブラリなど受ける恩恵も大きいです。廃止や警告のついたメソッドの改修などは骨が折れますが、概ね動作するところまでは、案外簡単にできるので、お手隙の際に新バージョンの検証をしてみてはいかがでしょうか。

Pocket

CONTACT

お問い合わせ・ご依頼はこちらから