What we did to upgrade a small Rails app from Rails 4.2.5 to Rails 5.0.0.beta1.
Now the upgrade is deployed in AWS, here is where we are at:
- When deploying, remember to change the secret key base to invalidate all sessions. ( or your users will get a nasty 500 error )
- Temporarily removed NewRelic from the gemfile – it doesn’t currently support Rails 5.0.0.beta1. (UPDATE: as of 11 Feb NewRelic supports Rails 5.0.0.beta2)
- Temporarily removed rspec-rails from the gemfile to avoid a deployment error on AWS (ArgumentError while loading rspec-support.gemspec: couldn’t find HOME environment)
Steps to upgrade:
-
We updated the rails gem version and ran bundle update, and upgraded gems including:
gem ‘nokogiri’, ‘1.6.3.rc1’ upgraded to ‘1.6.8.rc1’ gem 'newrelic_rpm' temporarily removed unltil support added for Rails 5.0 gem 'aws-sdk', '1.66.0' upgraded to ‘2.2.7’ gem 'coffee-rails', '4.0.1' upgraded to '4.1.1' gem 'coffee-script-source', '1.8.0' upgraded to '1.10.0' gem 'jquery-rails', '4.0.0.beta2' upgraded to '4.0.5' gem 'rspec-rails', '~> 3.1.0' upgraded to a git PR not yet released at the time: gem 'rspec-rails', :git => 'https://github.com/rspec/rspec-rails.git', :ref => '275905d' %w[rspec rspec-core rspec-expectations rspec-mocks rspec-support].each do |lib| gem lib, :git => "git://github.com/rspec/#{lib}.git", :branch => 'master' end
-
On running we got this compile error:
Solution: You have to use Puma for Rails 5.0 ( for Action Cable ). We were already using it but eventually tracked this down to the out-of-date puma gem version (2.9.1). To fix, specify the correct puma version in your gemfile:
gem 'puma', '2.15.3'
We also had to remove newrelic_rpm from the gem file because running bundle exec rake db:migrate caused this error:
rake aborted! NameError: wrong constant name [[:error, ["detected unsupported rails version 5.0.0.beta1"], nil]] /home/rof/cache/bundler/ruby/2.2.0/gems/newrelic_rpm-3.14.1.311/lib/new_relic/control/class_methods.rb:52:in `const_get'
-
Add or update files required for this release:
rake rails:update
Additions / updates included :
- config/application.rb
- config/environments/development.rb, production.rb & test.rb ( carefully merge changes )
- config/redis
- config/initializers/active_record_belongs_to_required_by_default.rb
- config/initializers/application_controller_renderer.rb
- config/initializers/assets.rb
- config/initializers/backtrace_silencers.rb
- config/initializers/callback_terminator.rb
- config/initializers/cors.rb
- config/initializers/inflections.rb
- bin/
-
Test failures: we got 50% failures ( and 1000 DEPRECATION WARNINGs - probably many will be resolved when rspec is updated. We will aim to get these down to zero again soon. )
Of the 50% test failures:
- 358 TypeErrors: can’t dump hash with default proc - all from one single line of code using Rails caching, easily fixed.
- 93 are NoMethodError: assigns has been extracted to a gem. To continue using it, add gem ‘rails-controller-testing’ to your Gemfile.
- 42 are NoMethodError: assert_template has been extracted to a gem. To continue using it, add gem ‘rails-controller-testing’ to your Gemfile.
- 21 are NoMethodError: undefined method `normalize_params' for Rack::Utils:Module
- 1 is ActionView::Template::Error: nil is not a valid asset source
To fix: the kaminari paginator causing an ArgumentError Generating an URL from non sanitized request parameters is insecure! - use the master branch from github:
gem 'kaminari', :git => "git://github.com/amatsuda/kaminari.git", :branch => 'master'
-
Deployment errors to AWS eb:
There was a ArgumentError while loading rspec-support.gemspec:
Temporary work-around : we run tests locally then comment-out rspec gems in gemfile before committing.
-
Errors in production:
a) On refreshing the browser with existing session - got a session crash with a marshal error. This is similar to https://github.com/rails/rails/issues/18164:
To fix: change the secret key base to invalidate all sessions.
b) Gmail started categorizing emails as spam.
To fix: duplicate the environment ( to get a new IP address ), swap URLs and delete the old environment.