The run() command does not return success/failure. If it succeeds, it
returns. If it fails, it raises an exception.

To get the result of a command, you can use the capture() method:

  http://wiki.capify.org/article/Capture

Note, though, that it runs the command only on a single host, so if you
want the output of multiple hosts, you'll need to use run() and give it
a block, so you can process the output yourself:

  http://wiki.capify.org/article/Run

To answer your question about one-command-per-task, you can definitely
put as many commands in as you want. As for conditionally running
commands, you can do that in a few ways.

First, if you have really complex conditional logic, it might be best to
put the entire task in a shell and run the script from capistrano, a la:

  task :do_something_hard do
    run "my_script"
  end

And my_script could either be shell script, or ruby, whichever floats
your boat.

Alternatively, for simpler needs, you can use shell if conditions
directly in capistrano:

  run "if [ some_command ]; then other_command; else last_command; fi"

However, it's really not feasible to test the run() command itself (via
exception rescuing, etc.) because just because the command fails on one
server, doesn't mean it failed on all servers. Consider:

  begin
    run "something that might fail"
  rescue Exception
    run "something assuming the first failed"
  end

If you run this task against more than one server, then it could be that
one server fails while the others succeed. In that event, an exception
would still be raised, resulting in the second run() being executed
against ALL SERVERS, not just the one(s) that failed.

Hope that makes sense,

Jamis

On 1/22/09 3:22 AM, Gerhardus Geldenhuis wrote:
> Hi
> Thanks for all the answers.
> 
> What I was unclear about is the relationship between the unix command
> line exit status and the success status of the task. It now seems
> clear that if the the command succeeds the task succeeds and vice
> versa.
> 
> This leads me on to another question. Should you generally encapsulate
> only one external command in a capistrano task, or can I have an if
> statement in my task that acts on the success/failure(true/false) of
> the command line.  I will illustrate by a simple example.
> 
>  if run "dosomething" then do task1
>  else first do task 2
> 
> and to clarify what I meant in my previous email I would also like to
> do the following:
> task
>   result = (run "command")
>   if result = 'a piece of string' then fail task immediatly to trigger
> rollback
> end
> 
> Regards
> 
> On Jan 21, 6:07 pm, Jamis Buck <[email protected]> wrote:
>> What Rafael said, except if you're rescuing the exception you should be
>> able to leave off the :on_error => :continue bit.
>>
>> Also, to force a task to succeed or fail...I assume you mean run()? Or
>> do you really mean task()?
>>
>> To force a run command to succeed, just append "; true" to the end of
>> the command:
>>
>>   run "something that might fail; true"
>>
>> Likewise, to make it fail, just append "; false" to the end:
>>
>>   run "something that must fail; false"
>>
>> (That's not Capistrano magic, that's *nix. Most (all?) unices come with
>> 'true' and 'false' commands. The 'true' command does nothing except exit
>> with a status code of 0. The 'false' command does nothing except exit
>> with a status code of 1.)
>>
>> - Jamis
>>
>> On 1/21/09 10:42 AM, Rafael G. wrote:
>>
>>> Gerhardus Geldenhuis wrote:
>>>> Hi
>>>> Is there a way to run different tasks based on the exit status of a
>>>> run command? Also how can I "force" a task to fail or succeed, how is
>>>> the failure/success of a task determined/defined.
>>>> Regards
>>> You can write a task with :on_error set to :continue and then catch the
>>> exception, I never done it, the idea is:
>>>   task :foo, :on_error => :continue do
>>>     begin
>>>       run "important task"
>>>     rescue Exception => error
>>>       puts "Important task fail!!: #{error}"
>>>       foo.task_if_foo_fail
>>>     end
>>>   end
> > 


--~--~---------~--~----~------------~-------~--~----~
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at http://groups.google.com/group/capistrano
-~----------~----~----~----~------~----~------~--~---

Reply via email to