[quads id=1]
今回はDocker環境下でのRuby・Railsアップグレード手順についてまとめたので解説したいと思います。Railsアプリケーションを運用している場合、アップグレード対応は必ず必要になってくる作業なので、事前に一度目を通しておくことをおすすめします。
アップグレード手順まとめ
- カバレッジの補強
- リリースノートの確認
- 開発ブランチの作成
- 最新版でないGemの確認
- development・testグループのGemアップデート
- テスト実行
- Gemの一括アップデート
- テスト実行(手動テストも)
- Rubyのアップグレード
- テスト実行(手動テストも)
- Railsのアップグレード
- rails app:updateの実行
- テスト実行(手動テストも)
- レビュー依頼
[quads id=1]
アップグレード手順詳細
1. カバレッジの補強
アップグレード作業を始める前にRSpecやMinitestのカバレッジを補強し、テストが全てパスすることを確認します。(カバレッジはsimplecovやcodecovを使用して計測しましょう)
カバレッジがどのくらい必要か、どこまでの範囲をテストで網羅するかについては、各プロジェクト判断になるので事前に確認しておきます。

2. リリースノートの確認
アップグレード予定のバージョンのリリースノートをチェックし、変更点を確認しておきます。アップグレードの注意点やアップグレード後に修正するべき箇所などが載っているので最初に必ず確認するようにしましょう。
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
の結果を見やすく整形してくれます。各プロジェクトの判断で導入してください。
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
=> エラーが出ないことを確認
8, テスト実行(手動テストも)
Gemアップデートが完了したら、再度テストを実行しエラーが出ないことを確認します。
% docker-compose run web rspec
今回はRSpecでのテストだけでなく、実際に画面を操作する手動テストも実行します。
RSpec等のテストコードで網羅できていない箇所を重点的にテストし、アプリケーションの挙動に問題ないことを確認してください。
9, Rubyのアップグレード
続いてRubyのアップグレードを行います。
Dockerfile
、.ruby-version
、Gemfile
のバージョンを最新バージョンに書き換えます。
# 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
10, テスト実行(手動テストも)
再度RSpecでのテストと手動テストを実行しエラーが出ないことを確認します。
% docker-compose run web rspec
11, Railsのアップグレード
ここからRailsのアップグレードを行いますが、現行のバージョンと最新バージョンとの差が大きい場合は段階的にバージョンを上げていきます。
「パッチバージョンのアップグレード→マイナーバージョンのアップグレード→メジャーバージョンのアップグレード」のように段階的にバージョンを上げることで、アップグレードによるエラーを解消しやすくなります。
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のアップグレードが完了です。
最後に設定や挙動に問題がないかレビューしてもらいましょう、お疲れ様でした。
参考
- Ruby3.1.0リリースノート
- Rails7.0.3.1リリースノート
- Docker + Rails(Ruby)をバージョンアップ(アップグレード)したお話
- 永久保存版!?伊藤さん式・Railsアプリのアップグレード手順
今回はDocker環境下でのRuby・Railsアップグレード手順についてまとめました。バグを防ぐ、アップグレード対応の負荷を減らすという観点から、日頃からアップグレードを心がけるようにしておきましょう。(アップグレード対応を先延ばしにすると後々大変になります)