🔖

安全なRailsのバージョンアップを目指して

2024/12/19に公開

本記事はSimpleForm Advent Calendar 2024の19日目の記事です。

今回は、シンプルフォーム株式会社が提供する「SimpleCheck」および「SimpleMonitor」において、Ruby on Railsのバージョンを 6.1.7.9 から 7.0.8.1 へアップデートした際の進め方をご紹介します。

Railsバージョンアップ時に感じる課題

Railsのバージョンアップはこれまで何度か経験しましたが、特にレビュアー視点から以下のような課題を感じていました。

  • 差分が膨大なPRのレビューが困難
    多くのファイルが変更されると、変更点の意図や影響範囲を把握しづらくなります。

  • 設定変更の影響範囲が不明確
    前のバージョンからの変更点がどこで、何がどう変わったのかを素早く理解しにくい状況に陥りがちです。

テストが通っているからといって、少しの動作確認で問題なさそうだからとリリースしてしまうと、後々テストが不足している箇所で不具合が発生することがあります。

こうしたリスクを軽減するためには、PRを細かく分割し、変更点を明示的に示すことが有効です。これにより、レビュアーは各変更の意図を理解しやすくなり、結果的にバージョンアップ時の不安を軽減できます。

Railsバージョンアップの一般的な手順

Railsガイドの Rails アップグレードガイド に沿った流れは以下が一般的です。

  1. Gemfile のRailsバージョンを変更し、bundle update railsを実行
  2. app:update を実行(対話形式で更新)
  3. config/initializers/new_framework_defaults_X.Y.rb をコメントイン
  4. config.load_defaults を新バージョンに変更

今回はこの流れに沿いながら、計7つのPRに分割して進めることで、差分を明確かつ小さく保つ工夫を行いました。

実際の進め方

0. ベースブランチ

Railsバージョンアップ用のベースブランチを用意します。これ以降は、基本的にこのベースブランチに向けてPRを作成していきます。

1. bundle update rails のみを行うPR

Gemfile のRailsバージョンを書き換え、bundle update rails を行った差分のみのPRです。
ここでテストが落ちれば、Railsの後方互換性のない変更による問題であることが明確になります

2. 落ちたテストを修正するPR

1で発生したテスト落ちを修正します。
レビュアーは、このPRで行われた修正をRailsのCHANGELOGやアップグレードガイドと照らし合わせることで、修正内容が適切か判断しやすくなります。問題なければ1にマージし、ベースブランチへ反映します。

3. app:updateを実行し全て上書き

app:updateを実行し、ファイル差分を全て「上書き」した状態のPRです。
この段階では大量の差分が出ますが、あえてここでは上書きのみを行い、必要な記述は後で戻します。

4. app:updateで上書きしたが必要な記述を戻す

3で上書きされてしまったが必要な記述をここで復旧します。
3と4を分けることで、今後のバージョンアップでも必ず戻す必要がある箇所を明確に把握できます。問題なければ4を3にマージし、ベースブランチへ反映します。

5. new_framework_defaults_X.Y.rbをコメントイン

config/initializers/new_framework_defaults_X.Y.rb をコメントインして、新バージョンの設定を有効にします。
ここでインラインコメントなどを用いて、各設定が何を意味するのか、どのような影響があるのかをPR上で説明します。こうすることでレビュアーはアップグレードガイドを参照しに行く手間が省け、理解が深まりやすくなります。

6. 落ちたテストの修正

5で有効にした設定によってテストが落ちた場合、それを修正します。
実際の作業では、設定ごとにPRを分け、より明確にすることも可能です。修正が完了して全てのテストが通れば6を5にマージし、ベースブランチへ反映します。

7. config.load_defaultsを変更

最後に、new_framework_defaults_X.Y.rb を削除し、config.load_defaults のバージョンを新しいバージョンに更新します。
どうしても有効化できなかった設定は config/application.rb に記述を移し、最終的に新しいバージョンへの移行が完了です。

インラインコメントでレビュー効率を向上

特に5のステップで、new_framework_defaults_X.Y.rb の設定箇所にインラインコメントを添えたことはレビュー効率に大きく貢献しました。
レビュアーはPR上で直接設定の意味や意図を把握できるため、不要なコンテキストスイッチを減らせます。

おわりに

今回は、レビュアーに優しいRailsバージョンアップ手順を紹介しました。1つのPRで全てを行うより、ステップごとに分割することで、変更点を明確にし、レビューのしやすさと正確性を高めることができます。

Railsの恩恵を受け続けるためには、バージョンアップは避けることのできないタスクです。今後も誤った設定の混入や見落としを未然に防ぐ「レビュアーフレンドリー」なバージョンアップを継続し安心安全なRails開発を続けていきたいと思います。

最後まで読んでいただき、ありがとうございました。

SimpleForm Tech Blog

Discussion