HerokuでRailsのバージョンを3.1.4から3.2.9にあげようとしてやや失敗

きっかけ

久しぶりに情処対策の機能追加をしようと思い、まずはRailsのバージョンを新しくしてからだなということで、Rails 3.1.4からRails 3.2.9へのバージョンアップ作業を実施。それにしても随分放置していましたね。

単純にバージョンアップ

3.1系と3.2系はそれほど違いがないということらしいのでGemfile直せば終わりだろうぐらいの感覚で着手。

まずはgemでRails 3.2.9をインストール。インストールが終わったら比較用のプロジェクトを作成。比較用プロジェクトのGemfileと既存のプロジェクトのGemfileを比較してバージョンが新しくなっているところを反映。そしてbundle update。

これは特に問題なく完了。

とりあえず起動

rails s

でとりあえず起動したところこんなエラーが出てきました。

uninitialized constant Factory (NameError)
`define': wrong number of arguments (1 for 0) (ArgumentError)

FactoryGirlの使い方が古いのが原因なので次のように修正。

Factory.define :answer do |a|

  ↓

FactoryGirl.define do
  factory :answer do |a|

これで起動時にエラーが出なくなって、動作も特に問題なさそうでした。

テスト実行

ちゃんと動いているみたいだから全部成功するかなと思いながらrspecを実行したらほとんど失敗しました。

原因はやっぱりFactoryGirlで、Factory.create(...)やFactory.build(...)のとしていたところで uninitialized constant Factory のエラー。FactoryGirl.create(...)とFactoryGirl.build(...)に修正しました。

これでエラーはすべて解消。modelでset_primary_keyがdeprecatedになっていたのでself.primary_keyに修正したり、views specのdescribe "test/index.html.erb" doのrenderの部分でDEPRECATON WARNINGが出ていたのでdescribe "test/index" doに修正というのもついでにやりました。

ちなみに警告の内容はこんなの。

Passing a template handler in the template name is deprecated.
Passing the format in the template name is deprecated.

Herokuにデプロイ

ローカル環境での動作に問題がなくなったのでHerokuにデプロイを実施。久しぶりすぎて秘密鍵パスフレーズを忘れるということがあったりしましたが、これは何とか思い出してgit pushをしたところInstalling therubyracer (0.11.0)の部分でこんなエラーが発生。

ERROR: Failed to build gem native extension. (Gem::Installer::ExtensionBuildError)

Rails 3.1+ Asset Pipeline on Heroku Cedarを見ると、

If you were previously using therubyracer or therubyracer-heroku, these gems are no longer required and strongly discouraged as these gems use a very large amount of memory.

なんて書いてあるのでなくてもいいんだと思って軽い気持ちでGemfileから削除。これでgit pushに成功。

アプリケーションエラー

結構あっさり終わったなと思いながらブラウザでアクセスしたらエラーになっていました。ログに出ているエラーはこれ。

Could not find a JavaScript runtime.

therubyracerはいらないのでは?と思いながら改めてさっきのページを読むとBambooじゃなくてCedarだったらということでした。タイトルにもCedarとか書いてありますしね。

一応スタックを確認してみるとbamboo-mri-1.9.2で動いていました。

BambooからCedarへの移行

Migrating to the Celadon Cedar Stackというページがあったので、それじゃあ移行すればよいかと思って説明を読んでみると長文だったので今日の所はあきらめました。

ここでやめにしたかったのですけど、エラーのままはまずいということで作業続行。git pushが成功していて戻すのも面倒なので、エラーの解消を目指すことに。

結果、therubyracerの代わりにtherubyracer-herokuを入れることでエラーが解消しました。というわけで一応Railsのバージョンアップには成功。日を改めてBambooからCedarへの移行はやりたいと思います。

教訓

いきなり本番環境にデプロイして、それがエラーになってしまったという問題が。趣味プロジェクトとはいえ一般に公開しているサービスなのでステージング環境での確認が必要ですね。

平日に仕事が終わって帰宅してからやるような軽い作業でもなかったです。