Rails

Docker環境下でのRubyとRailsアップグレード手順について簡単にまとめてみた

Rails



 

今回はDocker環境下でのRuby・Railsアップグレード手順についてまとめたので解説したいと思います。Railsアプリケーションを運用している場合、アップグレード対応は必ず必要になってくる作業なので、事前に一度目を通しておくことをおすすめします。

CircleCIを使用している場合、CircleCI側のアップグレード対応も必要になりますが、それらの説明はここでは省略しています。

アップグレード手順まとめ

  1. カバレッジの補強
  2. リリースノートの確認
  3. 開発ブランチの作成
  4. 最新版でないGemの確認
  5. development・testグループのGemアップデート
  6. テスト実行
  7. Gemの一括アップデート
  8. テスト実行(手動テストも)
  9. Rubyのアップグレード
  10. テスト実行(手動テストも)
  11. Railsのアップグレード
  12. rails app:updateの実行
  13. テスト実行(手動テストも)
  14. レビュー依頼



アップグレード手順詳細

1. カバレッジの補強

アップグレード作業を始める前にRSpecやMinitestのカバレッジを補強し、テストが全てパスすることを確認します。(カバレッジはsimplecovcodecovを使用して計測しましょう)

カバレッジがどのくらい必要か、どこまでの範囲をテストで網羅するかについては、各プロジェクト判断になるので事前に確認しておきます。

RSpec
【RSpec導入】RubyのテスティングフレームワークRSpecについて初心者向けにまとめてみたプログラミングにおけるテストについて、RSpecと呼ばれるテスト独自の言語を用いながら解説しています。作成したwebサービスが正しく動くかどうかを試験することで、事前にエラーになり得る箇所を発見できたり、要件漏れを防ぐことができます。ぜひマスターしましょう。...

2. リリースノートの確認

アップグレード予定のバージョンのリリースノートをチェックし、変更点を確認しておきます。アップグレードの注意点やアップグレード後に修正するべき箇所などが載っているので最初に必ず確認するようにしましょう。

Ruby3.1.0リリースノート
Rails7.0.3.1リリースノート
2022/09/01現在の最新バージョンのリリースノートを掲載しています。

3. 開発ブランチの作成

アップグレード作業を始める前に開発用ブランチを作成し、ミスがあった場合でもアップグレード前の状態に戻すことができるようにしておきます。

# 例), Ruby3.1.0へのアップグレード用開発ブランチを切る
% git checkout -b release-ruby-3-1-0

4. 最新版でないGemの確認

最新のRubyやRailsに対応していないGemが混じっている可能性があるため、RubyとRailsのアップグレードを行う前に最新版でないGemを確認します。

% docker-compose run web bundle outdated

# 出力例
Gem                 Current  Latest   Requested  Groups
actioncable         7.0.3    7.0.3.1
actionmailbox       7.0.3    7.0.3.1  >= 0       default
actionmailer        7.0.3    7.0.3.1
actionpack          7.0.3    7.0.3.1
actiontext          7.0.3    7.0.3.1
actionview          7.0.3    7.0.3.1
activejob           7.0.3    7.0.3.1
activemodel         7.0.3    7.0.3.1
activerecord        7.0.3    7.0.3.1
activestorage       7.0.3    7.0.3.1
activesupport       7.0.3    7.0.3.1
addressable         2.8.0    2.8.1
aws-partitions      1.603.0  1.624.0
aws-sdk-core        3.131.2  3.137.0
aws-sdk-kms         1.57.0   1.58.0
aws-sdk-sns         1.53.0   1.54.0   >= 0       default
aws-sigv4           1.5.0    1.5.1
fugit               1.5.3    1.6.0
minitest            5.16.2   5.16.3
openapi_parser      0.15.0   1.0.0
phony               2.19.13  2.20.0
public_suffix       4.0.7    5.0.0
rails               7.0.3    7.0.3.1  ~> 7.0.3   default
railties            7.0.3    7.0.3.1
rb-fsevent          0.11.1   0.11.2
redis               4.8.0    5.0.2
selenium-webdriver  4.3.0    4.4.0
strscan             3.0.3    3.0.4

bundle_outdated_formatterというGemを使用することで% bundle outdatedの結果を見やすく整形してくれます。各プロジェクトの判断で導入してください。

https://github.com/emsk/bundle_outdated_formatter

5, development・testグループのGemアップデート

RubyとRailsのバージョンを上げる前にGemのバージョンアップデートを行います。

その中でもアプリケーションへの影響が少ないと思われるdevelopmentとtestグループのGemアップデートを最初に行います。

% docker-compose run web bundle update -g development -g test

6, テスト実行

developmentとtestグループのGemアップデートが完了したら、テスト(RSpec)を実行しエラーが出ないことを確認します。

% docker-compose run web rspec

7, Gemの一括アップデート

Railsのバージョンは固定し、その他のGemを一括でアップデートします。

# Railsバージョンは固定
gem 'rails', '7.0.3'
% docker-compose run web bundle update

後方互換性が失われるような変更履歴が含まれる場合、Gemの一括アップデートを行うとエラーになってしまう可能性があります。

トラブルが起きそうなGemがある場合、それらのGemは1つずつアップデートを実行するようにしましょう。

# audited Gemのみアップデート
% docker-compose run web bundle update audited

# rspec
=> エラーが出ないことを確認

参考: auditedのCHANGELOG

8, テスト実行(手動テストも)

Gemアップデートが完了したら、再度テストを実行しエラーが出ないことを確認します。

% docker-compose run web rspec

 

今回はRSpecでのテストだけでなく、実際に画面を操作する手動テストも実行します。

RSpec等のテストコードで網羅できていない箇所を重点的にテストし、アプリケーションの挙動に問題ないことを確認してください。

アプリケーションのメイン機能やメール配信、SMS配信といった注意が必要な機能を中心に手動テストを行いましょう。

9, Rubyのアップグレード

続いてRubyのアップグレードを行います。

Dockerfile.ruby-versionGemfileのバージョンを最新バージョンに書き換えます。

# Dockerfile

- FROM ruby:3.0.2
+ FROM ruby:3.1.2
# .ruby-version

- 3.0.2
+ 3.1.2
# Gemfile

- ruby '3.0.2'
+ ruby '3.1.2'

 

続いて以下のコマンドでビルドとbundle installを実行します。

% docker-compose build --no-cache
% docker-compose run --rm web bundle install

 

Rubyのバージョンを確認し、変更後のバージョンが表示されれば完了です。

% docker-compose run web ruby -v
=> 3.1.4

現在使用しているRubyバージョンと最新バージョンが大きくかけ離れている場合は段階的にアップグレードすることをおすすめします。

# 現在使用しているバージョンと最新バージョンがかけ離れている場合のアップグレード例
2.5.7 → 2.6.6 → 2.7.2 → 3.0.0 → 3.1.0
段階アップグレードは必要ですが、Rubyは後方互換性を重視しているため、アップグレード後にトラブルは起きにくいと言われています。

10, テスト実行(手動テストも)

再度RSpecでのテストと手動テストを実行しエラーが出ないことを確認します。

% docker-compose run web rspec

11, Railsのアップグレード

ここからRailsのアップグレードを行いますが、現行のバージョンと最新バージョンとの差が大きい場合は段階的にバージョンを上げていきます。

「パッチバージョンのアップグレード→マイナーバージョンのアップグレード→メジャーバージョンのアップグレード」のように段階的にバージョンを上げることで、アップグレードによるエラーを解消しやすくなります。

Rails6.0.5→Rails6.0.6→Rails6.1.7→Rails7.0.4のような感じで段階的にアップグレードを行なっていきます。

 

Gemfileに記載されているRailsのバージョンを変更し、bundle updateを実行します。

# Gemfile

- gem 'rails', '~> 6.1.4'
+ gem 'rails', '~> 7.0.3'
% docker-compose run --rm web bundle update

12, rails app:updateの実行

次に新規バージョンに必要なファイル生成や修正するべき箇所を対話形式で教えてくれるコマンド、rails app:updateを実行します。

% docker-compose run web rails app:update
Overwrite /myapp/config/application.rb? (enter "h" for help) [Ynaqdh]
・
・
・
  • Y: 上書き実行
  • n: 上書きせず次に進む
  • a: 現在のファイル以降全てのファイルを上書き実行する
  • q: 処理中断
  • d: 新旧ファイルの差分を表示
  • h: 各キーの説明を表示

13, テスト実行(手動テストも)

再度RSpecによるテストと手動テストを実行します。

% docker-compose run web rspec

14, レビュー依頼

ここまででRubyとRailsのアップグレードが完了です。

最後に設定や挙動に問題がないかレビューしてもらいましょう、お疲れ様でした。

参考

 

今回はDocker環境下でのRuby・Railsアップグレード手順についてまとめました。バグを防ぐ、アップグレード対応の負荷を減らすという観点から、日頃からアップグレードを心がけるようにしておきましょう。(アップグレード対応を先延ばしにすると後々大変になります)