views:

618

answers:

2

I have a set of rake tasks where I need to invoke capistrano at some point. Edwin Goei's blog suggests shelling out to capistrano via "sh".

Is there a simpler way? It would seem you should be able to call the appropriate tasks programmatically. Thanks in advance.

+2  A: 

Yes, Capistrano has programmatic access to the command-line components. If you want to call them from a rake task, though, you need to do a little extra work.

task :deploy
  require 'rubygems'
  require 'capistrano'
  require 'capistrano/cli'

  parameters = ["deploy"] # this is an array of the strings that come after
                          # cap on the command line. e.g., 
                          # ["deploy", "-S", "revision=1024"] gives you local var
                          # revision in your deploy.rb.

  # The following is required ONLY when you run Capistrano 2+ from Rake, 
  # because Rake adds the methods from FileUtils to Object. FileUtils includes 
  # a method called symlink which interferes with Capistrano's symlink task.
  Capistrano::Configuration::Namespaces::Namespace.class_eval { undef :symlink }

  Capistrano::CLI.parse(parameters).execute!
end
Sarah Mei
Please note my comment above concerning "sh" vs "system". It seems that capistrano executes my command on the remote server via "sh" and the non-zero return value causes my rake task to exit earlier than I'd like.Is there any programatic resolution for my situation?Thank you for your help; I've gone ahead and marked this question as answered as I think my particular case is an edge case.
Jonathan R. Wallace
Capistrano does use sh - both in default tasks and when you call something via run. You can pass a parameter to the run method, :shell => false, which will run it without the sh. I believe you can also set a global in your deploy.rb, i.e., set :shell, false.
Sarah Mei
A: 

Jonathan, your mileage may vary by doing something like set(:shell, false) to stop capistrano running tasks in a sub-sh-shell.

Just a thought, feel free to ping me if you need a hand though.

Beaks