Haani, I agree with you that the download can happen in parallel first before bringing Tomcat down and it independent of the other tasks, so I made some changes to the flow.
I believe that I came up with a reasonable solution to the *Rolling Deployment* strategy I described above. First, I pass in to Capistrano an argument telling it what deployment type I want to perform: *Full* or *Rolling*. Then I follow this process: 1. Capture the server list from the appropriate role into another list. 2. Iterate over the new list. 3. Reset the original role to the value of the current server. 4. Apply all the tasks to that server alone 5. Leather, rinse, repeat... Here are the relevant changes to the deploy task: task :deploy do deploy_type = fetch(:deploytype).downcase case deploy_type when 'full' then download_bits shutdown_tomcat deploy_bits start_tomcat when 'rolling' then download_bits server_list = roles[:app].servers # get the original servers server_list.each do |current_server| # apply other tasks in series roles[:app].servers = [] # reset original server list role :app, "#{current_server}" # otherwise you'll append to it shutdown_tomcat deploy_bits start_tomcat end # each loop else puts 'Invalid deployment type' exit end # case deploy_type end # task :deploy Then you can invoke this with the following command: $ cap -f deploy.cap -s deploytype=rolling production deploy Feedback is appreciated! On Thursday, June 5, 2014 9:10:16 PM UTC-7, Haani Niyaz wrote: > > Hi Jonas, > > I've written some Capistrano tasks to address deploying to Tomcat too. I > understand Capistrano 3 is not an option for you but in Capistrano 3 there > is an option to run all commands sequentially on one server at a time. Not > sure if this is present in Capistrano 2. > > Just comparing flows, I download the file on all servers first. This way > even if the download fails, the service will still be up. > I also do a backup before deploying and then a restart. > > You can see my code here: > webapp.rake > <https://github.com/haani-niyaz/capistrano/blob/master/lib/capistrano/tasks/webapp.rake> > > Hope you find it useful. > > > > > > On Thursday, 5 June 2014 11:20:53 UTC+10, Jonas Gorauskas wrote: >> >> I am using *Capistrano 2.15.5* to deploy *Java *web applications to >> *Tomcat* application servers. For the time being, we are tied and >> committed to this version of Capistrano and we cannot upgrade to v3. The >> deploy task will call on the other tasks to get executed in parallel on all >> servers in the role. This works as expected and has been working well for a >> while. >> >> Now we need to implement a *Rolling Deployment* when the tasks are >> executed on one server at a time. So, based on the code below, we would >> execute shutdown_tomcat, download_bits, deploy_bits, start_tomcat on >> prdapp01 first and then prdapp02 and so on... So that only one server in >> the cluster is offline at any given time, thus maximizing our up-time. >> >> What is the best way to implement this *Rolling Deployment* strategy >> with Capistrano? >> >> This is what a paired-down version of my Capistrano script looks like >> currently: >> >> task :production do >> role :app, "deployuser@prdapp01", "deployuser@prdapp02", >> "deployuser@prdapp03" >> # ... >> end >> >> task :deploy do >> shutdown_tomcat >> download_bits >> deploy_bits >> start_tomcat >> end >> >> task :shutdown_tomcat, :roles => :app do >> run "sudo /sbin/service tomcat stop || exit 1;" >> end >> >> task :download_bits, :roles => :app do >> run <<-EOS >> [ -f /tmp/app_download ] && rm -rf /tmp/app_download; >> mkdir -p /tmp/app_download; >> cd /tmp/app_download; >> wget -q https://internal.server/path/to/application.war || exit >> 1; >> EOS >> end >> >> task :deploy_bits, :roles => :app do >> run <<-EOS >> cd /tmp/app_download; >> unzip -q -o /tmp/app_download/application.war -d /usr/local/ >> tomcat/webapps/ || exit 1; >> exit 0; >> EOS >> end >> >> task :start_tomcat, :roles => :app do >> run "sudo /sbin/service tomcat start || exit 1;" >> end >> >> >> Then I run ... >> >> $ cap -f deploy.cap production deploy >> >> -- You received this message because you are subscribed to the Google Groups "Capistrano" group. To unsubscribe from this group and stop receiving emails from it, send an email to capistrano+unsubscr...@googlegroups.com. To view this discussion on the web, visit https://groups.google.com/d/msgid/capistrano/344c9527-ba45-44b7-8f67-74814a2cde35%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.