2

我正在寻找一种方法来确保 capistrano 无论如何都会在运行结束时启动我的 tomcat。我在部署运行开始时将其停止,但在此后发生错误的不太可能的情况下,我无法再次启动它,即使错误只是未找到我要部署的工件。我可以将启动它添加到每个 on_rollback{} 中,但我宁愿找到一种更清洁的方式。

那么,换句话说,是否存在与 Java 的finally关键字等效的 capistrano?

4

3 回答 3

1

我知道已经有一段时间了,但是由于其他人可能碰巧发现了这个问题,我将把解决我的问题的代码留在这里。

您可以将您的任务包装在 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

您可以在执行结束时附加truefalse(如上面的第 3 行)以测试命令的失败或成功。

于 2013-11-09T03:46:26.737 回答
1

我假设你问的是 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
于 2013-09-05T18:07:38.690 回答
0

我将用另一种技术再次回答,因为在前一个答案中添加评论太短了。

在我的一个项目中,我覆盖了回滚本身:

namespace :deploy do
 namespace :rollback do

  task :default do
   liquibase.deploy.rollback_liquibase
   revision
   cleanup
  end
 end
end

您也可以尝试挂钩 rollback:revision 本身:

在“部署:回滚:修订”、“应用程序:do_task”之前

于 2013-09-27T16:53:00.137 回答