【问题标题】:Rolling Deployment of Java/Tomcat application using Capistrano使用 Capistrano 滚动部署 Java/Tomcat 应用程序
【发布时间】:2014-07-25 19:12:42
【问题描述】:

我正在使用 Capistrano 2.15.5 将 Java Web 应用程序部署到 Tomcat 应用程序服务器。目前,我们绑定并致力于此版本的 Capistrano,我们无法升级到 v3。部署任务将调用其他任务以在角色中的所有服务器上并行执行。这按预期工作,并且已经运行了一段时间。

现在我们需要实现一个滚动部署,当任务一次在一台服务器上执行时。因此,根据下面的代码,我们将首先在prdapp01 上执行shutdown_tomcat, download_bits, deploy_bits, start_tomcat,然后再执行prdapp02 等等......这样在任何给定时间,集群中只有一个服务器处于离线状态,从而最大限度地延长我们的正常运行时间。

使用 Capistrano 实施此滚动部署策略的最佳方式是什么?

这是我的 Capistrano 脚本的配对版本目前的样子:

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

【问题讨论】:

    标签: java tomcat deployment capistrano


    【解决方案1】:

    我相信我为滚动部署想出了一个合理的解决方案 我上面描述的策略。首先,我向 Capistrano 传递一个论证 它是我想要执行的部署类型:Full 或 Rolling。然后我跟着 这个过程:

    1. 将服务器列表从适当的角色捕获到另一个列表中。
    2. 遍历新列表。
    3. 将原始角色重置为当前服务器的值。
    4. 将所有任务单独应用到该服务器
    5. 皮革,冲洗,重复...

    以下是对deploy 任务的相关更改:

    task :deploy do
      deploy_type = fetch(:deploytype).downcase
      case deploy_type
        when 'full' then
          shutdown_tomcat
          download_bits
          deploy_bits
          start_tomcat
        when 'rolling' then
          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
            download_bits
            deploy_bits
            start_tomcat
          end                                  # each loop
        else
          puts 'Invalid deployment type'
          exit
      end                                      # case deploy_type
    end                                        # task :deploy
    

    然后你可以使用以下命令调用它:

    $ cap -f deploy.cap -s deploytype=rolling production deploy
    

    非常感谢您的反馈!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-14
      相关资源
      最近更新 更多