我正在寻找一种方法来确保 capistrano 无论如何都会在运行结束时启动我的 tomcat。我在部署运行开始时将其停止,但在此后发生错误的不太可能的情况下,我无法再次启动它,即使错误只是未找到我要部署的工件。我可以将启动它添加到每个 on_rollback{} 中,但我宁愿找到一种更清洁的方式。
那么,换句话说,是否存在与 Java 的finally关键字等效的 capistrano?
我正在寻找一种方法来确保 capistrano 无论如何都会在运行结束时启动我的 tomcat。我在部署运行开始时将其停止,但在此后发生错误的不太可能的情况下,我无法再次启动它,即使错误只是未找到我要部署的工件。我可以将启动它添加到每个 on_rollback{} 中,但我宁愿找到一种更清洁的方式。
那么,换句话说,是否存在与 Java 的finally关键字等效的 capistrano?
我知道已经有一段时间了,但是由于其他人可能碰巧发现了这个问题,我将把解决我的问题的代码留在这里。
您可以将您的任务包装在 Ruby (begin | rescue | ensure | end)块中。如下所示:
task(:my_task) do
begin
run "echo 'execute my deploy'; false"
rescue
run "echo 'executed on error'"
ensure
run "echo 'executed no matter what'"
end
end
您可以在执行结束时附加true或false(如上面的第 3 行)以测试命令的失败或成功。
我假设你问的是 Capistrano 2。
有前后命令。
你可以这样做:
after :deploy, :restart_tomcat
还有一些方法可以做到 on_error => continue
以下是我的 java 应用程序重启脚本中的一些片段。注意之前(或之后)的位置在任何命名空间声明之前。另请注意,在停止应用程序时,我忽略了错误。如果应用程序无法启动,我想要错误。
请记住,这里我在环境部署上调用初始化,或者开发人员可以手动调用该任务来重置环境。无论是在 :deploy 中调用还是作为 app.deploy.initialize_app 调用,它都可以工作
before "app:deploy:initialize_app", "app:deploy:stop_app"
namespace :app do
namespace :deploy do
task :initialize_app, :roles => :app do
#Do Stuff.
end
task :stop_app, :roles => :app, :on_error => :continue do
run "cd '#{deploy_to}/current/app/bin'; #{java_home_cmd}; ./tcserver.sh #{stage_name} stop"
end
task :restart_app, :roles => :app do
app.deploy.stop_app
print "Sleeping 60 seconds.\n"
sleep 60
run "cd '#{deploy_to}/current/app/bin'; #{java_home_cmd}; ./tcserver.sh #{stage_name} start"
end
end
end
我将用另一种技术再次回答,因为在前一个答案中添加评论太短了。
在我的一个项目中,我覆盖了回滚本身:
namespace :deploy do
namespace :rollback do
task :default do
liquibase.deploy.rollback_liquibase
revision
cleanup
end
end
end
您也可以尝试挂钩 rollback:revision 本身:
在“部署:回滚:修订”、“应用程序:do_task”之前