当前位置: 首页 > 知识库问答 >
问题:

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

谈炳
2023-03-14

我使用Capistrano 2.15.5将Java web应用程序部署到Tomcat应用程序服务器。目前,我们已绑定并promise使用此版本的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

共有1个答案

爱刚捷
2023-03-14

我相信我为上述滚动部署策略找到了一个合理的解决方案。首先,我向Capistrano传递一个参数,告诉它我要执行的部署类型:完全部署还是滚动部署。然后我遵循这个过程:

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

以下是部署任务的相关更改:

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

感谢反馈!

 类似资料:
  • 我试图用netbeans和Tomcat8部署java应用程序。单击debug时,在“Apache Tomcat或Tomee”选项卡中出现异常: 用netbeans和Tomcat进行部署还有另一种方法吗?我不想总是用Sudo从控制台运行netbeans。

  • 完成干净的构建后,我将war文件复制到Tomcat的文件夹中。但是部署会发生两次,并且在上下文已经存在的情况下以异常结束。我错过了什么? 非常感谢您的帮助。

  • 我在将spring boot应用程序部署到tomcat时遇到了问题,尽管在IDE中工作得很好。我按照https://docs.spring.io/spring-boot/docs/current/reference/html/howto-tegratic-deployment.html中的说明进行了操作 更详细的结构: mvn clear包给出错误:

  • 我正在尝试使用Visual Studio代码将java web应用程序部署到Tomcat,我有一些问题想与大家分享。 在安装了Tomcat for Java扩展之后,我尝试部署了一个Maven Java Web项目。为此,我点击了项目的文件夹并选择了“在Tomcat服务器上运行”选项。结果是出现以下错误消息:< code >该文件夹不是在Tomcat服务器上运行的有效web应用程序。 然后,我意识

  • 我正在尝试将.war、.aar、.xml和.properties文件部署到tomcat docker容器。我使用了下面的Dockerfile和基本的tomcat docker映像。 到目前为止一切正常。它提取war文件并启动容器内的应用程序。 但是现在我需要像这样添加/编辑“/usr/local/tomcat/webapps/root/web-inf//”和“/usr/local/tomcat/w

  • 在Intellij中,可以在同一端口上同时部署多个应用程序(部署在Tomcat实例中配置的应用程序)。在Tomcat start上应该部署的应用程序列表中,您在哪里添加/删除应用程序? Intellij文档这么说,但我找不到它描述的是什么文件。 除其他外,Tomcat配置文件可能会列出应在服务器启动时部署的应用程序。