One of my long-term client projects involves frequent data migrations (as opposed to the classical schema migrations one typically runs).
Up until recently I’ve been creating standalone rake tasks to perform the data migrations and executing them manually when deploying to Staging and Production.
Of course, the dangerous word in the above paragraph is ‘manually’.
This isn’t too much of an issue for Staging as I’m coming fresh from developing the rake task and it at the forefront of my mind. No, the real danger is that by the time Staging gets shunted over to Production I’ll invariably  forget to run the data migration, regardless of however lurid the colour I mark the task with  in a Trello label.
Enter the ‘after_party’ gem by Steve Mitchell.
With this fantastic gem I still get to write the migrations as tried and tested rake tasks, but these tasks are registered in a ‘task_records’ table, similar to schema migrations when executed, so they are only launched once.
The only issue I’ve had is integrating it with Capistrano 3. For those with similar struggles below is how my config/deploy.rb file is setup.
namespace :deploy do
desc 'Restart application'
task :restart do
on roles(:app), in: :sequence, wait: 5 do
# Your restart mechanism here, for example:
execute :touch, release_path.join('tmp/restart.txt')
end
end
after :publishing, :restart
after :restart, :clear_cache do
on roles(:web), in: :groups, limit: 3, wait: 10 do
within release_path do
with rails_env: fetch(:rails_env) do
execute :rake, 'after_party:run'
end
end
end
end
end