[2021/08 追記]
現在は Rails 5.2 にアップグレード済みです。
こんにちは。今年の 4 月に EC Booster チームからソーシャルPLUS チームに異動してきた id:daido1976 です。
今回はソーシャルPLUS の核となるソーシャルログインサービスの Rails アプリを 4.2 から 5.0 にアップグレードした話を書きます。
ソーシャルPLUS のサービスや技術スタックについては以下の記事が詳しいのでご参照ください。
はじめに
Rails 5.0 がリリースされたのは 2016 年、ということでアップグレードガイド的な記事はすでに素晴らしいものがたくさんあり、「rails 5 アップグレード」というキーワードやエラーメッセージをコピペして検索すれば大体の事象が解決できるはずです。
なので、今回はどんな状態の Rails アプリをどれぐらいの期間かけてどのように進めたかに焦点を当てて書いていきたいと思います。(あとは Tips も少々)
どんな状態の Rails アプリか
アップグレード前の環境: Ruby 2.5.7, Rails 4.2.11.3
2012 年に Rails 3 系からスタートし、2015 年の Rails 4 系へのアップグレードを経て、5 年ぶりにメジャーバージョンのアップグレードを行う Rails アプリです。
rails stats
コマンドの実行結果は以下の通りで、simplecov によるテストカバレッジは 92 % です。
技術的負債はそれなりに溜まっているものの、テストカバレッジが高いのが幸いでした。
どれぐらいの期間かかったか
約 1.5 ヶ月かかりました。
担当者の私が、今回アップグレードした Rails アプリをほぼ初めて触る状態ということもあり、コードリーディングや動作確認に手間取り、時間がかかりました。
また、このアプリの技術的負債の一つとして gem をやたらとバージョン固定していたこともあり、Rails のアップグレードを行う前準備として固定された gem をアップデートする必要もありました。
レビューの仕方
コードレビューは Zoom を用いて同期的に行い、私がレビュアーに変更点を説明、動作確認項目を箇条書きにし、抜け漏れがないかチェックしてもらいました。
また他の方がみて、変更の意図がわかりやすいように Commit メッセージの 2 行目以降に補足コメントをつけるなどの工夫をしました。
アップグレード時の Tips
ここからはアップグレード前にこれ知りたかった、という Tips を軽く紹介します。
便利な gem たち
Strong Parameters 対応に使える be_strong gem
今回のアップグレードの懸念の一つとしてモデルにある大量の attr_accessible
を Strong Parameters に移行するという作業があったのですが、その際に以下の gem が役立ちました。
使い方は以下の記事にわかりやすくまとまっています。
DEPRECATION WARNING のテストを変換する rails5-spec-converter gem
DEPRECATION WARNING: Using positional arguments in functional tests has been deprecated, ... Deprecated style: get :show, { id: 1 }, nil, { notice: "This is a flash message" } New keyword style: get :show, params: { id: 1 }, flash: { notice: "This is a flash message" }, ...
数ある DEPRECATION WARNING の中でも 👆 は警告文が長く、デバッグの邪魔になるので、Rails 5.0 へのアップグレードと同じ PR で修正しました。その際に以下の gem が大変便利でした。
カナリアリリース時のセッションデータ取得の不具合
ソーシャルPLUS では大量のアクセスを捌く必要があるため、常時複数台のアプリケーションサーバが稼働しています。
そのためインパクトのある変更は可能な限りカナリアリリース*1 を行い、バグ混入時の被害を最小限に留めるようにしています。
今回、Rails と一緒にアップデートされた rack gem にて、セッション ID を用いたセッションデータの取得ロジックに前方互換性がなく、カナリアリリース環境の時のみセッションデータが取得できなくなる不具合が見つかりました。
長くなってしまったので、詳細は以下の記事に書きました。
最後に
時間はかかりましたが、結果的に移行時のエラーも無く Rails 5.0 へのアップグレードを完遂することができました。
開発チームリーダーからお褒めの Unipos もいただけて嬉しかったです。
この勢いで Rails 5.2 系までは一気に上げてしまいたいと思っているので引き続き頑張ります!
ではまたお会いしましょう^^
*1:複数サーバのうちの一部にだけ新しいバージョンのアプリケーションをリリースするデプロイ手法