初めてのRailsアップグレード


railsのバージョンを v4.0.2 → rails v4.2.6にアップグレード。
そのアップグレードの際にやったことをまとめます。

基本的にはRailsアップグレードガイドにしたがって作業をすればよいです。
http://railsguides.jp/upgrading_ruby_on_rails.html

また対象バージョンのリリースノートも見て、変更点をチェック
http://railsguides.jp/4_2_release_notes.html


## まず最初に先人達が残していった記事を読む

### 変更点や修正内容の確認

**SPACE MARKET BLOG**
Railsを4.0系から4.1系にバージョンアップした話
http://blog.spacemarket.com/code/upgrade-to-rails-4_1/

Railsを4.1系から4.2系にバージョンアップしました。
http://blog.spacemarket.com/code/upgrade-to-rails-4_2/

**Money Forward**
エンジンのRailsを4.2にアップグレードした話
https://moneyforward.com/engineers_blog/2015/01/14/rails_4-2_upgrade/

SPACE MARKETさんのブログとMoney Forwardさんのブログ、rails4.2のリリースノートを見て変更点や実際の修正内容を確認します。
とはいえ当然使っているgemとかで影響範囲が違うので、ここは参考程度。

### アップグレードにあたっての心構えとか

**Qiita**
Railsをバージョンアップし続けるために必要なこと
http://qiita.com/joker1007/items/82db0b5d1a7f2572710b

**クックパッド開発者ブログ**
安心してRailsアップグレードを行うための工夫
http://techlife.cookpad.com/entry/how-to-safely-upgrade-rails


Railsをアップグレードするにあたって、どういう準備をしてどういったことに気をつければよいのか。

結構テストコードがしっかり書いてあることが前提なのですが、悲しいかなテストコードは無いのでテストは人力。

つらい

幸いサービスの規模はそこまで大きくないのでどうにかなります。
でもこういった大きな変更のためにテストコードがあるといいと改めて思いました。

まだ書いてない人がいたら自分の将来のために是非書きましょう。

## 実際やったこと

クックパッドさんのブログにもありましたが、エラーの監視とパフォーマンスの監視をしておくようにしました。別にここはアップグレードに限った話ではなく普段からやっておいたほうがよいですが。

### アップグレード後のエラー監視

サービスの規模が小さいとはいえ、人力テストだけではどうしたって漏れが出る可能性があります。そこで[Sentry](https://getsentry.com/welcome/)を使ってエラーの発生を監視するようにしました。

RailsでのSentryの設定方法はこちらを参考
http://d.hatena.ne.jp/akishin999/20140324/1395613736

ここでの注意ポイントはエラーが **アップグレードに発生したものなのか既存のバグなのか** をちゃんと判断できるようにしておかないとあまり意味ないです。なので普段からちゃんとエラーのチェックをしてエラーが無い状態をキープしておかないといけないですね。


![スクリーンショット 2016-04-28 13.13.43.png](https://qiita-image-store.s3.amazonaws.com/0/6808/a57e7d53-07c6-6e20-2f2d-33d822f9b6f3.png "スクリーンショット 2016-04-28 13.13.43.png")
エラーがあるとslackに通知飛ばします


### パフォーマンス監視
アップグレード後にパフォーマンスが落ちては困るので、パフォーマンスも定期的に見ます。そんなに厳密に見る必要はなかったのでzabbixを使ったWebシナリオを作りしなりを完了までの秒数をチェックします。

表示までの秒数を計測したければ
[ページ表示速度をPhantomJSで計測してZabbixに記録する](http://qiita.com/zaru/items/d6c6be01f7153f2bf9c1)
こちらの方法がおすすめ。

![スクリーンショット 2016-04-28 13.10.42.png](https://qiita-image-store.s3.amazonaws.com/0/6808/d1267a2e-eb85-9cd0-0746-952eaf159eec.png "スクリーンショット 2016-04-28 13.10.42.png")
こんな感じでグラフでみれます。


## コードの変更とか

この辺はいろんなところで情報出ているので、今更感はあるのですが今回対応した内容をまとめたいと思います。

### Gemfile

```
gem 'rails', '4.0.2' → gem 'rails', '4.2.6'
gem 'nokogiri' , '1.5.11' → gem 'nokogiri' , '~> 1.6.0'

```

railsのバージョンを変えただけだと怒られたのでnokogiriのバージョンも変更。
この辺りはエラーメッセージをきちんと読めば問題ないはず。
自分の場合は下記のようなエラーメッセージが表示されました。

```
Bundler could not find compatible versions for gem "nokogiri":
  In Gemfile:
    nokogiri (= 1.5.11)

    rails (= 4.2.6) was resolved to 4.2.6, which depends on
      railties (= 4.2.6) was resolved to 4.2.6, which depends on
        actionpack (= 4.2.6) was resolved to 4.2.6, which depends on
          rails-dom-testing (>= 1.0.5, ~> 1.0) was resolved to 1.0.5, which depends on
            nokogiri (~> 1.6.0)
```

もろもろ変更したら`bundle update`

### 設定ファイル系の変更

railsのバージョンが無事にあがったら下記を実行

```
rake rails:update
```

config以下にあるファイルを新しいバージョンに合わせて置き換えます。
上書きするかどうかをきかれるのですが、そのまま上書きすると今までの設定内容消えてしまうので、変更の差分だけ見て、必要そうな設定だけを適用していきます。

いくつか追加になったファイルもあります。

|ファイル名|何者か|
|----|----|
|config/secrets.yml|config/initializers/secret_token.rbから変更|
|config/initializers/assets.rb|assets周りの設定<br>http://qiita.com/ryounagaoka/items/8cbe76f2fb7a3157f07c|

### 古い記述を直す

```
DEPRECATION WARNING: The configuration option `config.serve_static_assets` has been renamed to `config.serve_static_files` to clarify its role (it merely enables serving everything in the `public` folder and is unrelated to the asset pipeline). The `serve_static_assets` alias will be removed in Rails 5.0. Please migrate your configuration files accordingly. (called from <class:Application> at /vagrant/www.example.com/config/application.rb:21)
```

こんな警告がでたので、記述の通りapplication.rbを
`config.serve_static_assets → config.serve_static_files`としました。

### gemの対応
モバイル判定とかできるbrowserというgemを使っていたのですがこれの書き方が変わってました。
browser.mobile? → browser.devise.mobile?

## 感想

サービスの規模がそれほど大きくないこともあって、思ったよりもすんなりいきました。ちょっとマニアックなgemとかを使ってない限りはそれほど問題はないのかもしれません。

なのでrailsアップグレードやんないとなーって思っている方は別の環境用意してそこで試してみると案外すんなりいくかも。

Let's upgrade!