I already have a deploy.rb that can deploy my app on my production server.
My app contains a custom rake task (a .rake file in the lib/tasks directory).
I'd like to create a cap task that will remotely run that rake task.
I already have a deploy.rb that can deploy my app on my production server.
My app contains a custom rake task (a .rake file in the lib/tasks directory).
I'd like to create a cap task that will remotely run that rake task.
run("cd #{deploy_to}/current && /usr/bin/env rake `<task_name>` RAILS_ENV=production")`
Found it with Google -- http://ananelson.com/said/on/2007/12/30/remote-rake-tasks-with-capistrano/
The RAILS_ENV=production
was a gotcha -- I didn't think of it at first and couldn't figure out why the task wasn't doing anything.
I have no idea how capistrano works, but just for the record -- this is the syntax to invoke a rake task from Ruby:
Rake::Task["task:name"].invoke
a little bit more explicit:
in your \config\deploy.rb, add outside any task or namespace:
namespace :rake do
desc "Run a task on a remote server."
# run like: cap staging rake:invoke task=a_certain_task
task :invoke do
run("cd #{deploy_to}/current; /usr/bin/env rake #{ENV['task']} RAILS_ENV=#{rails_env}")
end
end
Then, from /rails_root/, you can run:
cap staging rake:invoke task=rebuild_table_abc
This also works:
run("cd #{deploy_to}/current && /usr/bin/rake <rake_task_name>", :env => {'RAILS_ENV' => rails_env})
More info: Capistrano Run