I almost daren't link it as it caused a little controversy last week --but here's a wiki page I wrote to deal with how the Bash & Capistrano tasks fit together:
- http://wiki.capify.org/index.php?title=Handling_The_Unexpected - Lee 2009/1/22 Gerhardus Geldenhuis <[email protected]> > > On Jan 22, 4:08 pm, Jamis Buck <[email protected]> wrote: > > 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 > > I am in two minds about this. I want as little as possible "scripts" > on my servers. I believe that all/most logic should sit on > "management" server. This also makes building new boxes more simple. > On the other hand one can just just capistrano to distribute the > scripts or whichever other tool. > > > > > 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, > > It does now. :-) > One needs to remember that a task executed against a group of servers > will be considered a "single entity" eg I create a directory on my > test servers. if one fails then the task evaluate false in a true > statement, but if you have exception handling then the individual > server would still be taking care off. > > Regards > > > > --~--~---------~--~----~------------~-------~--~----~ To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/capistrano -~----------~----~----~----~------~----~------~--~---
