2024/12/14 Rails アップデートテクニック、2
Rails アップデートの際にどういった手順でやるか?というのは公式ドキュメントからも提供されていますが、おおかた自分は以下のとおりでやります 1. アップデートによる変更がどの程度あるかざっとつかむ
2. Gemfile Rails バージョンを上げて bundle install or bundle update --conservative rails
後者をやるシーンは、少なくとも Rails だけ上げたい、Rails バージョンに依存する gem がある場合は止めて確認したい、などのモチベーションです
ちょっと前までは bundle update --conservative rails activesupport actionpack actionview activemodel activerecord actionmailer activejob actioncable activestorage actionmailbox actiontext railties まで書かないとダメだったと思うんですが、昨今は rails だけでいいはず(?)
3. rails app:update で新しいバージョンのファイル作成やすでに存在するファイルのマイグレーションが実行されます
基本的には対話的に進めることが可能です
code:intractive.sh
$ rails app:update
identical config/boot.rb
exist config
identical config/application.rb
identical config/environment.rb
identical config/puma.rb
exist config/environments
conflict config/environments/development.rb
Overwrite /Users/tkdn/ghq/github.com/tkdn/rails7-app/config/environments/development.rb? (enter "h" for help) Ynaqdhm code:順に以下の意味
Y - yes, overwrite
n - no, do not overwrite
a - all, overwrite this and all others
q - quit, abort
h - help, show this help
d - diff, show the differences between the old and the new
m - merge, run merge tool
4. 1 での確認をひとつひとつ潰してテストを回し通せるようにする
幾ばくかの理由でそもそも起動できないということもあるので、テスト前に時間を使う場面もありますね
5. Staging 環境にあげてひととおりユースケースをなめてQAする
とりわけ 3 あたりが苦しい場面があります
理由は、Rails でスキャフォールドされたファイルのコメントアウトを残していないので、今回のアップデートによる純粋な追加差分なのか、以前から存在していた機能ではあるものの削除したために新たに生まれた追加差分なのかわからない状態だからです
過去のひとの粋な計らいとはいえ苦しいですね。スキャフォールドされたファイルのコードコメントは利用しなくても残しておきましょう
この rails app:update の場面で手際よくマージに使うのが以下のtipsです
新しい差分がなんなのかわかる RailsDiff を以下のポストで知って使うようになりました @suginoy: Rails で config/application.rb や config/enverironments/*.rb などの使わない設定は消さずににコメントアウトするのが自分的ベストプラクティスになった。バージョンアップ時の diff チェックが https://t.co/LI1erA4dSP の差分と app:update の結果との比較でかなり楽になる。 スレッドにもありますが、RuboCop による修正が入らないよう、Rails がスキャフォールドするファイルを対象外にしておくことも重要です
RailsDiff によって今回出ている差分が直接のアップデートによるものかという判断が可能でしょう
VSCode を使った前後比較のマージ
rails app:update の際のマージ用のエディタは環境変数 THOR_MERGE の指定がないとマージできません
VSCode の場合の設定は以下の記事を参考にしました
こうすることで対話形式でのアップデートの際に、m=merge で VSCode で以下のような画面をひらいて
https://david-runger-public-uploads.s3.amazonaws.com/app-upate-vs-code-three-way-merge.png
先程の RailsDiff での差分を見ながら、ポチポチするだけの作業になります
スキャフォールドされたファイルはとにかく差分を出さないという努力をし続けるのが、アップデートに時間をかけないポイントになると思います
今日は以上です