I run some simple Rails applications which I keep upgraded. I recently upgraded Ruby and Rails versions and since it's upgrade season, I'm making a note of my experiences ready for the next application I do, and on the off-chance it can help other people get started. And a reminder that I do do technical things occasionally, honest.
To note - this is a very simple Rails application, so only covers the basic gotchas I experienced. It was an app originally written in Ruby 2 / Rails 5 and in this iteration is now being upgraded from Ruby 2.7 / Rails 6 to Ruby 3 / Rails 7. The code is stored in a repository in Github, with CI done both via Github Actions and Codeship and deployment to Heroku.
Ruby upgrade
Good news! The Ruby upgrade (2.7.2 to 3.0.3) caused no problems at all, although I did need to update my Codeship config to remove the explicit installation of Bundler in my setup script.
Rails upgrade
I made use of the
Rails upgrade guide
- in particular I bounced the version of Rails in my Gemfile from 6 to 7 then
ran bundle exec rails app:update
which introduced the usual ton of rubocop
violations but also created some migrations acting on some tables which didn't
actually exist.
These were
ActiveStorage tables so I needed to create them with bundle exec rails
active_storage:install
then rearrange the migrations to get them to
work (ie put the creation migration before the modify migrations). I probably
could have eliminated the new migrations since I'm not using this function,
but it seems there are other references to these tables. It looks like Rails
expects these tables to exist, and the lazy option was to create it and be on the standard path. So I was lazy. Those migration do not include
timestamps, so I had to add those to appease the linter.
Second show-stopping problem - Rails 7.0.2.1 was a trap. It turns out there was a bug in ActiveSupport which manifested in a variety of different ways. For me, it stopped almost all automated tests working. It was reported and fixed quickly but did manage to cost me a chunk of time trying to figure out what was going on... Anyway, the simple fix is to use Rails 7.0.2.2 instead.
Now fixing some deprecation warnings. action_cable
has been renamed to
actioncable
and this will escalate to a breaking change in Rails 8 so this
needs updating in
app/assets/javascripts/cable.js
.
Also, I was getting references to using older (Rails 5.1) CSRF protection
behaviour. There are a load of defaults which are version locked in
config/application.rb
and these can be upgraded with config.load_defaults
7.0
as per the upgrade guide.
Locally, this was all that was required however when I deployed to production,
the heroku build failed at bundle exec rake assets:precompile
. Uglifier needed ES6 syntax enabling,
with config.assets.js_compressor = Uglifier.new(harmony: true)
in
config/environments/production.rb
.
And that was it! As I said, a very simple application so I'm sure I avoided much of the upgrade pain but I've noted my experiences here to help others get started.
All these changes are captured in a pair of pull requests:
No comments:
Post a Comment