Rails 5.1.6 から 5.2.0にアップデートしてみました

弊社で開発を進めているクラウドファンディングのサイトがもう少しでリリース出来る状態です。開発を開始した当時はRailsの最新が5.1.6だったのですが、先月の4月に5.2.0 がリリースされました。必須機能の開発も終わり少し余裕が出来たので、Railsのバージョンを上げることにしました。

全体的にはスムーズにバージョンアップできたのですが、一部ハマった部分もあるので記録しておきます。

5.1.6→5.2.0にアップデートする手順

Rails アップグレードガイド をざっと目を通して進めます。5.1.6から5.2.0はあまり変更無しで動かせそうです。

1. Gemfile の中の記述を rails 5.2.0 に変更

2. bundle update

3. rails app:update
routes.rb等は上書きしないように注意します。(私はどのへんが変わったのか見たかったので全部上書きしてgitのdiffで差分を確認しながらマージしました)

4. rails 5.2.0 から bootsnap というgemが必要になったのでGemfileに追記

gem 'bootsnap'

5. bundle install

6. rails s

これだけでローカルでは問題なく動作しました。簡単で良かった!(ここまでは)

その他、修正した細かい部分

画像アップロードにcarrierwaveを利用しているのですが、画像URLの取得部分が厳密になっていてエラーが出るようになりました。(railsとcarrierwaveどちらをバージョンアップしたことに起因するかは調べてません。)

それなので、下記のような変更を数カ所で行いました。

<%= image_tag(project.image.medium, class: 'thumb') %>
 ↓
<%= image_tag(project.image.medium.url, class: 'thumb') %>

ソースコードがきれいになりました。

ハマったのはproduction環境

rails 5.2.0ではsecret周りが大きく変わっています。今までのsecret.ymlもそのまま利用できるようにはなっているのですが、折角なので credentials.yml.enc を使うことにしました。
ちなみに、バージョン管理にはgitを使っています。

1. ローカル環境で次のコマンドを実行して、credentials.yml.encとmaster.keyを生成

EDITOR=vim rails credentials:edit

2. .gitignore に master.key を追加

3. credentialを使うので config/environments/production.rb で次の変数にtrueをセット

config.require_master_key = true

4. commitしてpush

5. サーバにsshでログインしてpull

6. RAILS_MASTER_KEY を環境変数に設定する!!
Capistranoでデプロイする時、この部分がちゃんと理解できておらずハマりました。Capistranoは.bash_profileに書いても読み込まれず、.bashrcに記載する必要があるそうです。
先程、ローカルで作成したmaster.keyをRAILS_MASTER_KEYとしてexportします。つまり、.bashrcの末尾に次のような記述を追記します。

export RAILS_MASTER_KEY='XXXXXXXXXXXXXXXXXXX'

7. Capistranoを使ってデプロイできればOK

おまけの変更点

非同期処理にはSidekiqを利用しており、プロセス管理にmonitを使っていたのですが、環境変数周りが変わったことでこちらも修正が必要でした。monitはrootで動作しており、.bashrcに記載したRAILS_MASTER_KEYが読み込まれなかった。。

それなので、monitでの動作は、su – ec2-user のようにユーザ変更してから、sidekiqプロセスを実行するように変更しました。

まとめ

今回対象としたプロジェクトでは、rails 5.1.6から5.2.0へのアップデートは比較的スムーズにできました。今開発中のサービスが早くリリースできるように頑張りたいと思います。