Ruby
RubyOnRails

Rails 5へのアップグレードでやったこと。

More than 1 year has passed since last update.

(社内LT用の資料としてざっとまとめました。)
質問とかあればコメントでお願いします。


概要

Rails4.2 => Rails5.0 へのアップグレード頑張った。


やったこと

  • アップグレード用のブランチを用意
  • Rubyを2.2以上にする。
  • bundle update rails が完了できるまで頑張る。
  • Rails5標準の実装に変更する。(Rails5 アップグレードガイドとリリースノートを見つつ)
  • テストが実行できるまで、gem を update したり、パッチ当てたり頑張る。
  • 落ちてるテストをひたすら修正する。
  • deprecation warning を出している gem をアップデート
  • rails s で モンキーテストする。

アップグレード用のブランチを用意

間違ってもmasterにアップデートコミットを積まないように。


Ruby2.2 以上にアップデートする。

rbenv で 2.3.1 に切り替える。
Gemfileでrubyディレクティブを使ってバージョンを指定するのがおすすめ。

ruby '2.3.1'

bundle update rails が完了できるまで頑張る。

Gemfile で gem 'rails', '5.0.0' に書き換えて、bundle update railsを実行。
バージョンの競合とかで色々、エラーになって進まないので、ひたすら、バージョンの整合性を整えつつ、update する gem を追加していく。


【例】

Bundler could not find compatible versions for gem "activerecord":
  In Gemfile:
    activerecord-session_store was resolved to 1.0.0, which depends on
      activerecord (< 5.1, >= 4.0)

    rails (= 5.0.0) was resolved to 5.0.0, which depends on
      activerecord (= 5.0.0)

    seed-fu was resolved to 2.3.5, which depends on
      activerecord (< 4.3, >= 3.1)

上記の例だと、seed_fu が activerecord の5.0.0以上のものを利用しているバージョンまで update する必要がある。

最終的に以下のupdateを行った。

bundle update rails act-fluent-logger-rails i18n_generators inherited_resources sass-rails seed-fu default_value_for jquery-rails sinatra

Rails5標準の実装に変更する。 (Rails5 アップグレードガイドとリリースノートを見つつ)

rake rails:update

でアップデートする。
競合するconfig内ファイルはdiffを見て、上書きするかどうか決める。
別ディレクトリに rails new で作成したファイルと比較するのも良い。

後は Rails5 アップグレードガイドリリースノート を見つつ、必要に応じて、ファイルを修正していく。


テストが実行できるまで、gem を update したり、パッチ当てたり頑張る。

テストが無事に実行できるまで、エラーになる gem を修正する。
gem の updateにあたっては以下の手順で対応のバージョン、またはリビジョンを探す。

  1. githubの対応ブランチを探す。
  2. issueやpull reqの状況を確認する
  3. forkする or 捨てる

詳しくは 参考URL を参照すること。


落ちてるテストをひたすら修正する。

頑張れ、超頑張れ!!


deprecation warning を出している gem をアップデート

deprecation warning がなくなるまで、該当箇所を修正したり、gemをアップデートする。
gemのアップデート手順は bundle update のやり方と同じ。


rails s で モンキーテストする。

テストコードが整備されていないようなところは手動でテスト


参考まで