我正在使用 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 传递一个论点 它是我想要执行的部署类型:完整或滚动。然后我跟着 这个过程:
- 将服务器列表从适当的角色捕获到另一个列表中。
- 迭代新列表。
- 将原始角色重置为当前服务器的值。
- 将所有任务单独应用于该服务器
- 皮革,冲洗,重复...
以下是对 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/