无论错误如何,都可以使用capistrano执行代码

时间:2013-08-09 08:37:58

标签: deployment capistrano continuous-deployment

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

那么,换句话说,是否有一个相当于Java的最终关键字的capistrano?

3 个答案:

答案 0 :(得分:1)

我假设您在询问Capistrano 2。

有命令之前和之后。

你可以这样做:

 after :deploy, :restart_tomcat

还有办法做on_error =>继续

以下是我的java应用程序重启脚本的一些片段。请注意,before(或after)之前的位置是在任何名称空间声明之前。另请注意,在停止应用程序时,我忽略了错误。如果应用程序无法启动,我想要错误。

请记住,我在环境部署上调用初始化,或者开发人员可以手动调用任务来重置环境。它的工作方式无论是: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

答案 1 :(得分: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

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

答案 2 :(得分:0)

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

在我的一个项目中,我重写了回滚本身:

namespace :deploy do
 namespace :rollback do

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

您也可以尝试挂钩回滚:修订本身:

在“deploy:rollback:revision”,“app:do_task”

之前