古いRailsを使ったプロジェクトを少しだけアップデートする方法

最終更新日

rails6

かなり老朽化したrailsのシステムをアップデートするのは非常に骨の折れる作業なので、時間の関係で最新にはせずできる限りあげるという作業をした時のやり方を紹介します。

目標を決める

対象のアプリケーションはherokuで稼働しているのですが、今回は heroku-18 というバーチャルマシンになるとのことでアップデートを1ヶ月以内にしないと動かなくなりますよ!っと警告が来たのでやらなかったらアプリケーションの死が待っているだけでした。

さて、最新にしたら良いかもしれませんが、使っているGemによっては既にアップデートされなくなっていたり、無くなってしまったものがあるので一気に挙げてしまうといろいろな問題にぶつかるかもしれません。

今回は最低限 heroku-18で動く環境を最低目標として、だいぶ古いのですが Railsの 4.2.8 を目指すことになりました。

ここで説明するのは応用を利かせてアップデートする方法でここに掲載のバージョンをそのままコピーしてもダメな場合があるためご自分で以下の説明をなぞりながらご自分の環境のRailsに合わせてアップデートしてみてください

PR

RailsとRubyのバージョンを上げた

RubyGems.org

rbenvでrubyのバージョンアップは2.3.0を使っていたのですが2.5.3までアップデートしました。

その後、GemfileのRailsのバージョンを変更しbundle updateを行いました。そうすると入らなかったGemなどエラーが出ました。

  • oj のバージョンが古い
  • factory_girl_rails が factory_bot_rails に名前が変更
  • fog のバージョンが古い&リネームされた
  • pg が新しすぎる
  • devise の設定の書き方が古い

エラーやバグが出るかの確認方法

正しく動いているか確認する方法ですが、一番すぐ引っかかるのがbundle updateを実行したタイミングですね。うまくコンパイルできなかったりしてインストールに失敗します。

コード的に相性が悪い場合は rails s を実行し開発サーバをたちあげた時や実際にコントローラーやモデルで呼び出されたタイミングでエラーが出ることもあると思います。

  • bundle update に失敗する
  • rails s した時に失敗する
  • 特定のライブラリが使われたタイミングでエラーが出る

地道に試しながらチェックするしかないので少しめんどくさいです。

ojのバージョンをアップデート

oj ですがバージョンが新しすぎても古すぎてもダメなようでした。

RubyGem.org でrails 4.2.8がリリースされたタイミングでリリースされているojを調べることにしました

Rails のリリースバージョン一覧

RubyGems.org でrailsの過去のバージョンの一覧を表示し4.2.8をブラウザの機能で検索します。そうするとFebruary 21, 2017 (1.41MB) とあります。

2017年2月21日ごろにリリースされたojをピックアップしましょう
以下のように2017年1月ごろにリリースされている2.18.1や2.18.x系の2.18.5が相性的に良い気がしました。今回は2.18.5にしてアップデートをしてみました。
エラーがなくなり動くようになりました。

oj のリリースバージョン一覧

factory_girl_rails を factory_bot_rails にリネームする

次に factory_girl_rails がリネームされて factory_bot_rails になったようです。Gemの名前の変更が社会的な理由で変わったりしたようです….

こちらはコード内でFactoryGirlというClassを呼び出しているようでそれが原因でエラーになってしまうようでした。FactoryBot に変更する必要がありました。

Fogのアップデートとリネーム

fogというgemは fog-awsにリネームされたようだったので上のojと同じく同じ時期にリリースされたバージョンを探しバージョンの差し替えを行ったのとClassの呼び出されているところのコード修正をしました。

pg が新しすぎる

PostgreSQLをDBに使っている場合に必要なgemですが、どうやら使っているデータベースのバージョンにも合わせないとうまく動かないようでした。
少し古めで設定する必要があって、使いたいRailsのバージョンに合わせてさし変える必要がありそうです。

devise の設定の書き方が古い

Rails を起動しようとすると devise の initialize コードでエラーが出ました。
記述を確認したのですが特に悪いことをしていないように思えましたので、Rails のバージョンに合わせて oj の時と同じように同じ頃にリリースされた devise を RubyGems.org で探しました。

bundle update で devise のアップデートをしたら動いたようです。

だいたい他の作業をしながらですが2日から3日で解決しました。
最新にすると検証も含めて1週間以上かかる可能性があったので1ヶ月後のダウンを避けるため最低限の対応ということで短期間でチェックまで完了することができました。

PR

やってみて

gem それぞれの相性がややこしくgemのリネームが行われるとコードの修正も行う必要があり結構手間なので見積もりをするときに甘く見ると時間オーバーをしてしまうようです。ご注意ください。

ある程度の間隔でRailsのアップデートをしていないとまとめてアップデートしないといけないので非常に時間がかかってしまいます。半年や1年など様子をみてアップデートするようにしましょう。

東京でシェアハウスをしています。ウェブサービス系のエンジニアとして活動しています。生活に取り入れると便利なモノやウェブサービスなどの紹介をこのブログで配信していこうと思っています。 過去に家を持たないホテル生活を2年し、オープンなシェアハウスなども3年ほど経験。衣食住を楽にする方法を模索しています。 twitter: hatch2

PR

シェアする