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.

Reply via email to