Staying on master while doing heavy upgrades
Upgradinating is a process we have used a few times at Lonely Planet now that’s saved us a lot of time and grief.
We have recently completed a few technical milestones that have been haunting us for some time:
- Upgrading from Rails 2.3.x to Rails 3.2.x
- Upgrading from Ruby 1.8.7 (REE) to Ruby 1.9.3
Having issues in the past with large chunks of work and a strong desire not to branch, we wanted a way we could keep shipping code without interrupting or slowing down our releases. We came up with the idea of forward-porting what we could and scripting up all other changes - and we called it upgradinating.
Enough talk, time for the code!
helper = UpgradinateFileHelper.new 'OLD NESS', 'NEW-NESS' helper.upgradinate_files [ "/path/to/project/Gemfile" ]
# NEW-NESS gem 'awesome_thing_to_put_in' gem 'deprecated_badness' # OLD NESS
- You may need to update grep to use ‘–exclude-dir’
- Make sure upgradinate_script.rb is executable
# Mac OSX brew install xz #required for installing grep through homebrew brew install https://raw.github.com/Homebrew/homebrew-dupes/master/grep.rb
- Simple example updating from an old Jasmine version to Jasminerice
- Upgrading from Ruby 1.8.7 to 1.9.3
Why this works
- You don’t disrupt the rest of the team’s development work
- Easy to test your changes, can setup a CI build on old and new versions
- You’re changes are visible to the rest of the team, less conflicts
- Ability to push your changes quickly
- [Branching by abstraction] (http://paulhammant.com/blog/branch_by_abstraction.html)