java - 使用 Capistrano 滚动部署 Java/Tomcat 应用程序

标签 java tomcat deployment capistrano

我正在使用 Capistrano 2.15.5 将 Java Web 应用程序部署到 Tomcat 应用程序服务器。目前,我们被绑定(bind)并致力于此版本的 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

最佳答案

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

  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

欢迎提供反馈!

关于java - 使用 Capistrano 滚动部署 Java/Tomcat 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24049246/

相关文章:

deployment - Nexus 或 Artifactory 可以存储简单的 tar.gz Artifactory 吗?

java - 如果有内括号,如何将一对括号内的内容与正则表达式匹配?

java - 使用 StringTokenizer 和连接字符串之间有什么区别吗?

c# - 在安装中创建用户

spring - 如何在不使用命令行上的 -javaagent 的情况下使用 Spring 和 Tomcat 设置加载时编织

java - 如何在 java 中使用 JAX - RS 和 tomcat 在 eclipse 中使用 Web 服务从数据库中插入和检索数据

azure - 使用 Bamboo 持续部署到 Azure

java - 是否应该有任何线程驻留在线程池之外?

java - 定期垃圾回收是否有助于提高 JVM 性能?

Tomcat在同一台机器上不是按IP响应而是在网络中响应