views:

3088

answers:

5

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.

+16  A: 
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.

Richard Poirier
Teflon Ted
A: 

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
August Lilleaas
Why was this downvoted?
Benjamin Oakes
I didn't downvote you but it's probably because that doesn't work within Capistrano.
thenduks
A: 

If the Rake task requires user interaction, it will not work

+6  A: 

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
Coward
A: 

This also works:

run("cd #{deploy_to}/current && /usr/bin/rake <rake_task_name>", :env => {'RAILS_ENV' => rails_env})

More info: Capistrano Run

acw