[Day 1: B-9] Railsアップグレード百景


yhirano55
yhirano55 commented 6 months

登壇者: フリーランス 中村 涼

これまで自分が担当してきた幾つかのRailsアプリのアップデートを振り返り、遭遇してきた問題から特に良かったものをピックアップし、コードを交えながら紹介していきます。

Railsのバージョンを上げるということについて、より現実的な話をお伝えできればと思います。主にRails 4、5、6を対象としています。


  • このセッションに関する質問を募集中です
  • 事前に聞きたいことがあれば、何でも書き込んでください。
  • 質問への回答はお約束できません。あらかじめご了承ください

Like(0)

Questions and feedbacks (8)

r7kamura
r7kamura commented 6 months

Railsのアップグレードは「上位バージョンでも動くようにする」というのが大事ですが、新しいバージョンで追加された機能を使う(置き換える)みたいなことも発生するかと思います。それは別のフェーズでやるのでしょうか。また、どのように進めていらっしゃいますか。

これは Rails のバージョンをまず先に上げて、それが完了したら新しいバージョンで追加された機能で置き換える、という二段階で進めています。もしどうしても同じ期間に開発作業を進めないといけない場合は、Rails のアップグレードのブランチをつくって、そのブランチを fork して新機能を使うブランチで開発を進めて、適宜前者から後者に変更を rebase しながら進めていく、という感じの進め方になると思います。

Like(1)

r7kamura
r7kamura commented 6 months

新旧両立できる書き方、という話がありましたが、それができなかったりする事例などあったりしますでしょうか?またそれをどう超えてきたなど教えていただけると幸いです。

軽い問題で言うと、例えば「Rails 4.2 のうちから Rails 5.1 でも動くコードにしたい」という状況において、

  • Rails 4.2 では migration ファイルで ActiveRecord::Migration[4.2] を継承すると動かない
  • Rails 5.1 では migration ファイルで ActiveRecord::Migration[4.2] を継承しないと動かない

という問題がありました。これは Rails のバージョンを見て継承元を条件分岐させるようにして対応しています。大抵の問題はバージョンを見て条件分岐させると解決できます。

重い問題で言うと、resque_mailer という gem があります。これは以下のような問題がありました。

  • Rails 5 にするには resque_mailer のバージョンを 2.2 から 2.4 に上げないといけない
  • resque_mailer 2.2 から 2.4 にすると Redis に格納されるデータの形式が変わる
  • Redis に旧形式のデータが格納されている状態で resque_mailer のバージョンを上げると正しく取り出せなくなる

データを保存するタイプのライブラリでフォーマットの形式が変わると大変で、サービスを動かしたまま変更するのは更に難しい、という問題ですね。これは新旧両対応の形式に変えるパッチを加えて対処できるように対処しようとしたのですが、結局メンテナンスでサービスを止める機会があったので、その機会に Redis の中身を空にしてからバージョンを変更することにしました。

Like(0)

r7kamura
r7kamura commented 6 months

config の更新や rails new 時に生成されているファイルについてなにか気をつけていることはありますか

rails new したときの commit メッセージに、付けたオプションとその理由について書くようにしています。

http://railsdiff.org/ という、rails new したときに生成されるファイルのバージョンごとの差分を見られる Web サイトがあるので、バージョン変更時はこれも参考にしています。

Like(1)

r7kamura
r7kamura commented 6 months

これまでのrailsアップグレードで最もキツかった事象とその原因について可能な範囲でお聞きしたいです。

Rails 3から4にしたらActiveRecordのパフォーマンスが大きく劣化した件が大変でした。対応が難しく、またこの対応が後のRailsアップグレード時に問題となるので更に大変でした。ActiveRecordがオブジェクトを大量に生成するようになってしまったことが原因です。ActiveRecordにの要所要所にmonkey-patchを入れて対応したという感じです。

Like(1)

pupupopo88
pupupopo88 commented 6 months

Railsのアップグレードは「上位バージョンでも動くようにする」というのが大事ですが、新しいバージョンで追加された機能を使う(置き換える)みたいなことも発生するかと思います。それは別のフェーズでやるのでしょうか。また、どのように進めていらっしゃいますか。

Like(0)

anonymous
anonymous commented 6 months

新旧両立できる書き方、という話がありましたが、それができなかったりする事例などあったりしますでしょうか?またそれをどう超えてきたなど教えていただけると幸いです。

Like(0)

mtsmfm
mtsmfm commented 6 months

config の更新や rails new 時に生成されているファイルについてなにか気をつけていることはありますか

Like(0)

colorbox
colorbox commented 6 months

これまでのrailsアップグレードで最もキツかった事象とその原因について可能な範囲でお聞きしたいです。

Like(0)

Create Comment

Please sign in to comment.

Sign in with GitHub
This software is available as open source under the terms of the MIT License.
Copyright © 2018 Yoshiyuki Hirano