MAGAZINE
ルーターマガジン
伊藤さん式Railsアップグレード(5.0系→5.2系)をやってみた
はじめに
こんにちは。アルバイトの秋山です。 弊社では、Railsを用いてアプリケーションを開発していますが、今回はそんなRailsアプリを運用していく上で避けては通れないRailsのバージョンアップグレードの手順について、弊社での実体験に基づいてご紹介したいと思います。
伊藤さん式Railsアップグレードとは
伊藤さん式Railsアップグレードとは、「プロを目指す人のためのRuby入門」の著者でもある伊藤淳一さんが以下の記事で紹介しているRailsのアップグレード手順のことです。
外部ユーザーのいるアプリケーションを想定して、なるべく不具合が発生しないようにアップグレードを行うためのコツが数多く散りばめられているので、安全にアップグレードを行うことができるようです。 今回はそんな伊藤さん式のRailsアップグレード手順に沿って、弊社のRailsアプリケーションをアップグレードしてみました。
前提
- Railsの5.0系→5.2系のアップグレードを対象とします。
- 本記事で紹介する手順は他の環境でも再現できるとは限らないので、各自の環境でアップグレードを試みる際は十分に注意して行うようにしてください。
手順
1. Railsアップグレードガイドの内容確認
まず公式のRailsガイドを参照し、アップグレードをする際に注意すべき点がないかや新たなバージョンで非推奨になったメソッドや記法がないかを確認します。今回は、5.0系→5.2系のアップグレードになるので、以下の項目を参照しました。
- Rails 5.0からRails 5.1へのアップグレード
- Rails 5.1からRails 5.2へのアップグレード
2. テストの通過確認
つづいて現状のコードでテストが全て通っているかを確認します。このとき、既存のテストコードに抜け漏れがないかも同時に確認します。弊社では日頃よりrspecを用いてテストコードを記述しており、すべて通過することは確認できていました。
3. 開発用ブランチの作成
バージョンアップ用の作業ブランチをマスターブランチから切り出して作成します。
git checkout -b rails_upgrade5.1
4. Rails以外のgemのバージョンアップ
railsのバージョンを先に上げてしまうと、その他のgemが最新のrailsに対応しておらず、エラーを引き起こす可能性があります。そのため、ここではrails以外のgemを可能な限り最新バージョンに引き上げます。
4-a. 最新でないgemを洗い出す
bundle outdated
というコマンドを用いて最新でないgemを洗い出すことができます。
❯ bundle outdated
Fetching https://github.com/doabit/semantic-ui-sass.git
Fetching https://github.com/mono0x/extractcontent.git
Fetching gem metadata from https://rubygems.org/.........
Resolving dependencies...
Gem Current Latest Requested Groups
actioncable 5.0.7.2 7.0.7.2
actionmailer 5.0.7.2 7.0.7.2
actionpack 5.0.7.2 7.0.7.2
actionview 5.0.7.2 7.0.7.2
activejob 5.0.7.2 7.0.7.2
activemodel 5.0.7.2 7.0.7.2
activerecord 5.0.7.2 7.0.7.2
activesupport 5.0.7.2 7.0.7.2
︙
4-b. developmentとtestグループのgemを先にアップデートする
developmentとtestグループのgemはアプリケーションの挙動に影響を与える可能性が低いため、これらのグループのgemから先にアップデートを進めていきます。具体的には以下のコマンドを用いてアップデートをすることができます。
bundle update -g development -g test
4-c. トラブルの起きる見込みのあるgemから一つずつアップデートする
bundle outdated
の結果を踏まえて、大きくバージョンの変わりうるgemや経験上アプリケーションの挙動に大きな影響を与える可能性の高そうなgemから一つずつアップデートしていきます。
弊社ではページネーションに用いている"kaminari"というgemやテストに用いる"rspec-rails"などのgemに対して優先的にアップデートを進めました。この際、gemのバージョン更新履歴などを確認して、Railsのバージョンと互換性のあることが確認できた範囲内で最新のバージョンに引き上げることに注意が必要です。
例えば、"rspec-rails"のchangelog.mdにはバージョン5.0.0以上ではRails5.2未満のサポートを終了している旨が記載されていたため、今回はバージョン4.1.1までの更新に留めることに注意しました。
アップデートは以下のようなコマンドで実行することができます。
bundle update rspec-rails
4-d. 残りのgemをまとめてアップデートする
最後に残りのgemをまとめてアップデートします。
bundle update
この際、Railsのバージョンが変更されないようGemfile上で以下のように固定する必要があることに注意が必要です。
# railsのバージョンを5.0.7に固定する
gem 'rails', '5.0.7'
gemのバージョンを上げたら、テストを実行し、問題なく通過することを確認します。もしテストが落ちるようであれば、適宜修正が必要になります。
5. Rubyのバージョンアップ
伊藤さん式の手順ではRubyのバージョンが古い場合はこのタイミングでバージョンアップすることが推奨されていますが、弊社ではRubyとRailsの互換性に問題がなかったため、バージョンアップは行いませんでした。
6. Railsのパッチバージョンアップ
いよいよRailsのバージョンアップを進めていきます。ここでは、Railsのマイナーバージョンやメジャーバージョンを上げる前にパッチバージョンを最新に引き上げます。弊社ではRailsのバージョンが5.0.7で5.0系の最新バージョンであったため、パッチバージョンをこれ以上引き上げる必要はありませんでした。
7. Railsのメジャーorマイナーバージョンアップ
それでは準備が整ったので、Railsのバージョンを上げていきます。この際バージョンは飛ばさずに一つずつ上げていきます。5.0→5.2ではなく、5.0→5.1→5.2といった具合です。
# Railsのマイナーバージョンを5.1系に上げる
-gem 'rails', '5.0.7'
+gem 'rails', '~> 5.1.0'
# Rails5.1のアップデート
bundle update
この際最新のパッチバージョンを適用するのが望ましいので、Gemfileでは~> 5.1.0
という記法を用いるのが良いでしょう。
8. rails app:updateタスクの実行
次にrails app:updateタスクを実行していきます。 これによって、新しいバージョンで必要になるconfigの変更や新たなファイルの作成を対話的に進めることができます。
$ rails app:update
identical config/boot.rb
exist config
conflict config/routes.rb
Overwrite /myapp/config/routes.rb? (enter "h" for help) [Ynaqdh]
force config/routes.rb
︙
といった具合で進んでいきます。ファイルを上書きする場合はどのように処理するかを尋ねられるので、[Y/n/a/q/d/h]の6種類の中から処理の仕方を選ぶことになります。それぞれの意味は以下のとおりです。
Y - Yes。そのまま上書き実行
n - No。上書きしない
a - All。全ファイルを上書き
q - Quit。タスクの中断
d - Diff。上書き前後の差分を表示
h - Help。入力する各キーの意味を表示
一旦すべて上書き(a)してしまってから、必要に応じて、設定をもとに戻すのが効率的であるように感じました。
9. RailsDiffの確認
ここでは手順8のタスクの実行によって上書きされたファイル以外にも変更が必要なファイルがないかを確認していきます。 具体的にはRailsDiffというページで異なる2つのバージョンを照らし合わせながら、確認するのがよいでしょう。 例えば、5.0.7と5.1の差分は以下のように表示することができます。これを参照しながら、適宜手動で変更を加えていきます。
10. ローカル環境での動作確認
Railsのアップグレード、その他ファイルの修正などが完了したら、テストを行い、動作確認をします。
弊社ではここで、いくつかのエラーに直面しました。具体的なエラーの内容をここに記述することはできませんが、これまで看過されていた「危うい記法」が新しいバージョンのRailsではきちんとエラーとして警告されるようになったようなものが多かったです。このように、より安全にアプリケーションを運用していく上ために必要な警告を出してくれるようになるというのもバージョンアップをする意義の一つでしょう。
また、新しいバージョンのRailsでは動作が不安定になってしまったgemも存在しました。そういったgemは利用を停止し、同様の機能をもつ別のgemに切り替えることで対応しました。
テストが通るようになったら、ローカル環境での動作確認を終了し、次のステップに移ります。
11. ステージング環境での動作確認
次はステージング環境での動作確認です。ローカル環境では正常に動作していても、ステージング環境ではうまくいかないということは往々にして生じるものです。ログを観察しながら、エラーが発生していないかを確認したり、目視で動作に不具合が生じていないかを確認したりすることが、より安定した安全なアプリケーションをユーザーに届けることにつながるはずです。
12. プルリクエスト・コードレビュー
ステージング環境でも正常に動作することが確認できたら、プルリクエストを出し、他の社内メンバーにレビューを依頼します。他の人の環境で動かしてみて初めて発覚する不具合などもあるかもしれません。
13. 本番環境での動作確認
最後にプルリクエストをマスターブランチにマージし終えたら、ようやく本番環境にデプロイすることができます。ここまで本当にお疲れ様でした。しかし、最後まで気を抜いてはいけません。本番環境でもきちんと動作確認を行いましょう。本番環境での動作確認は数日間に渡って行い続けます。リリース後もエラーが起こらないか チェックしましょう。
これにてRailsのバージョンアップグレードは完了です。 お疲れ様でした。
おわりに
ここまで読んでくださった皆さん、ありがとうございます。皆さんはRailsのアップグレードを滞りなく進めることができたでしょうか。私は、Railsのアップグレード作業を行う中で、幾多のエラーに直面し、思うように進まず頭を悩ませてしまうことがありました。しかし、この経験を通じて、今後もより一層安全で安定したアプリケーションを運用していくためには日頃から十分に注意して開発を進める必要があることを身にしみて感じることができました。この記事を読んでくださった皆さんも、そういった意識が芽生えたり、再確認するきっかけになっていたりしたら幸いです。ありがとうございました。
参考
本記事の参考とさせていただいた伊藤淳一さんにはこの場を借りて感謝したいと思います。ありがとうございました。
CONTACT
お問い合わせ・ご依頼はこちらから