クライアントワーク事業部サーバサイドチーム所属しております。長谷川です。
みなさま初めまして!こちらの記事はTech Kayac Advent Calendar Migration Trackの21日目の記事です!
今回はとあるRailsで動いているサービスのversionを3から5にアップデートしたお話を綴っていきたいと思います。
はじめに
どういう切り口でお話を進めようかすごく迷いますね・・・
細かい内容はGoogle先生に聞いたら先人のみなさまの知見にアクセスできると思いますので、ここでは「こんなことがあったんですよーハハハ」的な感じで進めていこうと思います
そもそもですが・・・私はタイトルの通り今年新卒で入社してRuby歴もRails歴も数ヶ月程度のペーペーでございます。 Rubyはみんな大好きチェリー本こと『プロを目指す人のためのRuby入門』を読んだ程度でRailsも『パーフェクトRuby on Rails』を読んだ程度ですね。
プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで (Software Design plusシリーズ)
- 作者:伊藤 淳一
- 出版社/メーカー: 技術評論社
- 発売日: 2017/11/25
- メディア: 大型本
かれこれ数年ほど前から「アップデートしないとなぁ」という話が上がっていたものの先送りされていたことなんだそうです。そんな中、カヤックのコーポレートサイト のRailsのversionアップをやってのけた私のメンターのところにお話が舞い込み、私がやってみることになりました!
何をどうアップデートしたか
- Ruby 2.1.2 => 2.6.3
- Rails 3.2.22.4 => 5.2.3
メジャーバージョン2つ分を爆上げですね・・・
このプロジェクトは・・・
そこそこの年月続いているサービスのようです。
DBのtable数をのぞいてみると155ありました。
個人では実感のわかないtable数ですね・・・規模としては結構大きいものなんだそうです。
github上に上がっているrubyのファイルは1649個・・・View用のSlimファイルも818個・・・もう何が何だか
(私の経験値的に大きいのはわかるがどれぐらい大きいのかピンとこない・・・)
どうやって進めて行ったか
頼りになる先輩もいらっしゃるので、相談して進めていくことに
- まずは用意されているRSpecのテストが通るか確認する
- Rubyのversionを最新にしてみる
- Railsのversionを4.2にあげてgemの依存関係を更新
rails server
で起動できるようにする- Railsのversionを5.2にあげてgemの依存関係を更新
rails server
で起動できるようにする- RSpecのテストが通るようにする
エラーになったときこういうところを参考にしましたよ
1. やはり本家本元Railsガイド!
アップグレードガイドやリリースノートなど素晴らしいリソースが盛りだくさん!
2. gemのgithubのREADMEやWikiやissue
こちらも情報盛りだくさん! ほとんど英語で読むのがしんどいところもあるけどgemに関してのエラーの対処は最短ルートを提示してくれているものがたくさんあって助かりました。
これら以外にも、QiitaやStackOverFlowも参考にさせていただいている部分が結構あります!
3. プロジェクトのコミットログやコメント
上二つの情報をみてもrailsのversionを4.2にあげたあたりで原因がわからず途方に暮れて相談しにいったとき・・・
頼りになる人 「initializerでモンキーパッチ当ててるねぇ コミットログとか見てみて」
コミットログは・・・
rails 3.2.22.2 で query method には 4 つの引数が必要になった しかし、jpmobile の rails 3 のものにはそれの対応がこないので、 モンキーパッチを当てて回避. 4.2 ぐらいまであげられたら消したい。
まさしく今がそのとき!
コミットメッセージ残してくださって本当にありがとうございました! 私もコミットのメッセージを丁寧に書こうと思った瞬間でした。
大変だったなと思うエラー達
attr_accessible
との戦い ~これ全部StrongParamaterにするんですか!?~
Railsのversionを4.2にあげてrails server
しようとしたときのこと・・・
undefined method `attr_accessible'
ふむふむ attr_accessible
が無いと・・・なるほど
Rails アップグレードガイド - Railsガイドをみると確かに書いてあります。
Rails 4.0ではStrong Parametersの導入に伴い、attr_accessibleとattr_protectedが廃止されました。これらを引き続き使いたい場合は、Protected Attributes gem を導入することでスムーズにアップグレードすることができます。
Protected Attributes gemを入れればいいのか!
(このとき彼はその場しのぎであることには気づかないのであった・・・)
そもそもattr_accessible
ってなんだ?
attr_accessible (ActiveRecord::Base) - APIdockによるとマスアサインメントの脆弱性の対策に利用するようですね。
確かにStrongParameterが実装されたのなら必要なさそうだ。ただ、attr_accessible
はActiveRecordのメソッドなのでモデルで利用されているのに対し、StrongParamaterにするためのpermit
メソッドはActionControllerのものなのでコントローラーに書く必要があります。attr_accessible
使ってるところが膨大にあって全部書き換えるのはしんどい・・・gemで対応できるならそうしちゃおう!
さてさて、審判の時・・・Railsのversionを4.2=>5.2にあげてみると
protected_attributes gem のサポートを終了。 Ruby on Rails 5.0 リリースノート - Railsガイドより
あ・・・ぐぬぬ・・・
そうも言っていられず色々調べていると救世主が・・・! tech.pepabo.com ほんと助かりました! これのおかげで万事解決では無いもののかなり短縮できました。
image_tag
とcarrierwave
との戦い ~画像がなければ作ればいいのよ~
image_tag
でエラーが出てる・・・
nil is not a valid asset source
ふむふむ、rails5になってimage_tag
がnil
を許容しなくなったのか!なるほどなるほど
引数に渡しているのはcarrirewave
でアップロードした画像のversionを指定しているURLのよう
uploaderにはたくさんversionを定義されていました。 ついでに何やら怪しいコメントも・・・
# application.controller内のcarrierwave_version_on_the_flyから呼ばれているときだけ、VERSIONSが有効になる # すなわち、アップロード時にはVERSIONSをつくらない
それでversionが生成されていないからnil
になるのか・・・
image_tag
で確認した後に画像がなかったらversionを作って表示するということらしい(後で教えてもらった)
あれ・・・image_tag
のそもそものエラーが出ている場所はActionView
ではなくconfig/initializers/image_tag_helper.rb
嫌な予感・・・中身を確認してみる
# 標準のimage_tagヘルパをオーバーライド def image_tag(source, options = {}) # ↓↓改造ここから↓↓
Oh... 改造って書いてある・・・(なんかカッコイイ!)
オーバーライドしてるならsource
にnil
が渡されたときの動作を書き加えてなんとかできる気がするぞ。
image_tag
とcarrierwave
の間に依存関係ができていたようですね。
コメントがあって助かりました!
振り返ってみる
感想など
エラーの原因などがRubyによるものなのかRailsによるものなのか、はたまたgemによるものなのか・・・ いったいどれなんだぁ・・・わけがわからん・・・と思いながら最初の方は進めていましたが、後半になってくるとそれを紐解いていくのがちょっと楽しくなってきました。
RubyやRailsについての知見がとても深まりました!
どれぐらいかかったのか
このアップデート作業を始めたのがちょうど6月の頭で12月まで続きました・・・ 期間的には半年ですが、最初のうちは1週間のうち2日をこちらの作業に当てるペースでしたが、1,2ヶ月ほど別の案件に注力していた時期もあったり、そして11月はこのアップデートにがっつり時間をさいてブーストして完了しました。トータルで見ると2~3ヶ月といった感じでしょうか
Rails6についても少し
updateをやってる最中にRails6がリリースしました。 Rails6まであげてしまおうかと言う話もありましたが、Rails5.2の公式のサポートも続いていることと、一部のgemがRail6に対応していないということもありRails6へのupdateは見送ることになりました。
+α ちょっと脱線ですが・・・
私のメンターが超オススメしているRubyの本『メタプログラミングRuby』にも助けてもらったので載せておきます! Ruby初心者がステップアップできるような内容だなと勝手に思っております。
- 作者:Paolo Perrotta
- 出版社/メーカー: オライリージャパン
- 発売日: 2015/10/10
- メディア: 大型本
Rubyはモンキーパッチやゴーストメソッドのおかげか実装が実際にどこに書かれているのかわからないなんてことも結構ありました・・・ チェリー本の作者の伊藤淳一さんのQiita記事なんかもとても参考になりました。ありがとうございました!
最後に
いやはや本当にいろんな人に助けてもらいました。 ありがとうございました!
そして、最後まで読んでいただき、これまたありがとうございました!