ボクココ

サービス開発を成功させるまでの歩み

今更ながら Rails 5.1 にアップデートした話

ども、@kimihom です。

f:id:cevid_cpp:20180121202451p:plain

先日、ようやく Rails 5.1 にアップデートしたので、それについて簡単にまとめを書いていこうと思う。

アップデートの経緯

前までは Rails 4.2.x の最新をアップデートし続けている形で運用していた。 Rails 5 以降の新機能はチェックしてきたんだけど、どうしても使いたい機能とかがなかったため、 Rails 4.2 のままでいいやと そのままにしてきた。最近になって Rails 5.2 の話も出てきたので、いよいよアップデートしないとレールに乗り遅れるってことで Rails4.2 からRails5.1 に一気に上げることにした。

Rails のアップデートに関しては Gem の依存関係をクリアして本元 Rails をアップデートした後、ひたすら失敗したテストコードを直しまくるという形で対応した。アップデートの詳細な方法に関しては、他のブログなどでたくさん取り上げられている話題であるので、本記事では省略させてもらう。ここら辺の作業はコードの整備も兼ねてできたので、前より綺麗なソースコードになって良かった。

Rails5.1 からの Yarn への移設はかなり気に入っている。これのおかげで今まで 外部 JavaScript は app/assets/javascripts/vendor みたいなところに突っ込んでいたのから解放された。今後は定期的に各 JavaScript ライブラリのバージョンアップを行って、JavaScript ライブラリのレールにもうまく乗っかっていきたいと考えている。また、CDN で公開されていた JavaScript ライブラリでも、それが npm で公開されている場合は全てそちらに移した。これによって application.js として一つにまとめられた状態として読み込まれるので、余計な通信を削減することになる。

form_forform_with に一括して変更した。おそらく今後は form_with が標準になるだろうし、既存コードのほとんどが remote: true なアクションだったため、form_with を使う方が合っていた。form_with の使い方の記事は以前書いたので興味がある場合は参照してほしい。

Rails 5.1 を Heroku にデプロイする方法も特殊だったので必要に応じて参照いただきたい。

そして最後は機能の全てを手動テストした。テストコードだけでは全ての動作を保証できないので、手動テストで実行して見つけたエラーをひたすら直すことで、晴れてリリースを迎えることができた。メソッドが動くけど結果が地味に挙動が変わったりすることもあったので注意したいところだ。最終的には以下のような diff となった。外部ライブラリを Yarn で入れるようにした分でだいぶ Rails プロジェクトがスッキリした。

$ git diff master --stat
367 files changed, 13907 insertions(+), 32253 deletions(-)

アップデート後のパフォーマンスなど

Rails 5.1 にあげたことで、運用面で問題にならないかが心配だった。メモリが急上昇してしまったり、特定の処理のレスポンスが極端に遅くなるなど、これらの項目は実際に本番環境に上げてみないとわかりづらい項目である。

今の所、Rails 4.2 のころとあまり変わらない感じで安定している。これに関して今後、Puma のスレッド数やワーカー数をチューニングしてどの値が最適化を調整していく予定だ。ワーカー数は2にした瞬間にメモリが 100% を超えてしまったので、 Rails x Puma x Heroku の場合は ワーカー数は1にするしかない気がする。現状、スレッド数8, ワーカー数1で運用している。

終わりに

なかなか思い切ったソースの修正をしたけど、ユーザーには全く変わっていないように見える。そうした改善は個人的には結構好きで、バージョンアップ以外にもちょくちょく続けている。ひとまず Rails5.1 の最新版にあげられたので、一安心だ。このための自動&手動テストはかなり慎重にやってきたので、リリースできたときは嬉しかった。

こうしてアップデートをすることで、また自分のソースコードに愛着が湧いて、今後もメンテナンスを続けたいと思えるようになる。近々 Rails 5.2 にもアップデートして、ActiveStorage を使ってみたいと思う。

もし Rails4.2 を使っている方がいて、この記事が少しでも参考になったなら幸いだ。