Rails 5.1.6 から 5.2.2.1 へアップデートしました!

こんにちは。CAMPFIRE のエンジニア はっさん です!
今回は Rails のアップデートに関する記事です。

この記事では、アップデートする上で起きた問題と解決策の詳細は書かないためご了承ください。アップデートの簡単な手順と、大変だったこと・大まかな対処方法を書いていきます。

前書き

CAMPFIRE ではこれまで Rails 5.1.6 を使っていましたが、先日 5.2.2.1 にアップデートしました。目的は脆弱性の対策と、今後は最新のバージョンを追随し、いち早くその恩恵を受けるためです。今回は 5.2.2 のリリースを予定していた日に security fixed version が出たので、その翌週 5.2.2.1 にアップデートしました。

下準備

Rails のバージョンアップデートをする上で必要なこと・気をつけることを知るために下調べから始めました。Rails では公式がアップグレードガイドを公表しているので入念に読みます。

また、今回は 5.2 を介するアップデートなため、どのような変更があったのかを知るために 5.2 のリリースノートにも目を通します。

https://railsguides.jp/5_2_release_notes.html 

手順

以下から実際のアップデート手順になります。

まず Gemfile 内の Rails のバージョンを上げます。

gem 'rails', '5.2.2'

$ bundle upgrade rails をします。

$ bundle upgrade rails

...

redis-session-store was resolved to 0.9.1, which depends on
  actionpack (>= 3, < 5.2)

inherited_resources was resolved to 1.8.0, which depends on
  actionpack (>= 4.2, <= 5.2)

...

この時エラーがズラーっと出ててきますが、実際に関係があるのは依存関係の条件に満たしていない gem です。今回上げるバージョンは 5.2.2 なので確かに actionpack (>= 3, < 5.2) や actionpack (>= 4.2, <= 5.2) は当てはまらなくなります。なので Rails のバージョンをあげる前より先にこれらの gem のバージョンを上げます。

$ bundle upgrade inherited_resources redis-session-store 

gem のアップデートが終わり次第 1 に戻り、rails をアップデートします。

$ bundle upgrade rails

...
Bundle updated!

これで rails 5.2.2 へバージョンアップが完了です。

その後 railsサーバーを再起動してアプリケーションが動作したらひと段落です。何かしらのエラーが出る場合、エラー内容でググるかリリースノートを見て関係していそうな変更を探して原因究明をして解決します。*1

問題なさそうな場合、テストを実行します。数十 ~ 数百のテストが落ちるので一つずつ修正していきます。テストと Lint が全て通った後、一通り手動での動作確認も経て問題なければ完了です。

さらっと書きましたが、Rails のアップデートが終わってから動作確認までが本番です。

*1 ここの原因究明・解決について、需要があれば別途書きます。

大変だったこと ・ 対処方法

● アップデートした gem のバグを踏んだ

rails コマンド ( db:create、db:migrate、assets:precompile )の実行時に NoDatabaseError が出る現象に遭遇しました。

Rails と一緒にバージョンを上げた gem である counter_cluture のバグを踏んでしまったことが原因でした。幸い、修正がすぐにマージされて次のバージョンがリリースされたので良かったのですが、最初に Rails のアップデートを疑っていたので気づくのに遅れました。エラーのスタックトレースを追ってリリースノートに特に記述がなければ、怪しそうな gem のリポジトリにある Issue や PR を検索してみると良いでしょう。

● Lint 系の gem のバージョンを上げて悲鳴

Rails のアップデートは動作の検証に時間がかかります。検証している間もチームメンバーの成果物がどんどん master に取り込まれていくため、その差分を取り込む度に Lint を修正するのは大変です。

なので、rubocop や View の Lint 系のバージョンは固定して、Rails のアップデートとは切り離しました。バージョンを固定することで、master を取り込む度に修正する必要が無くなり、差分が小さくレビューもしやすくなります。

● 検証環境での不可解な現象 

検証環境で puma コンテナが定期的に落ちるという現象に遭遇しました。

 worker の再起動に puma_worker_killer を利用していたのですが、再起動するための閾値を再起動した時に超えていたのです。それを繰り返してある時 puma 全体が一度落ちてしまうことが原因でした。アップデートによりアプリケーションの起動に必要なメモリの使用量が上がっていたので、メモリ使用量の閾値を上げることで対処しました。

まとめ

以上を経て無事、Rails のアップデートを完了させることができました。

以下、アップデートリリース後のチームメンバーの様子です。

同時に走っていたキャッシュ化プロジェクトの成果も相まって、体感でサイトが早くなった事に喜んでいます。

来る Rails 6 が楽しみですね!

この記事が気に入ったら、サポートをしてみませんか?気軽にクリエイターを支援できます。

10

CAMPFIRE

#スタートアップ 記事まとめ

スタートアップが手がけたnoteが集まるマガジンです。スタートアップが読むべき、知るべきnoteも選んでいきます。
コメントを投稿するには、 ログイン または 会員登録 をする必要があります。