capistrano不会调用deploy:执行deploy时启动:cold

时间:2014-04-09 15:06:24

标签: capistrano

我正在使用capistrano 2来部署我的应用程序。根据文档,deploy:cold任务会调用deploy:update,然后调用deploy:migrate,最后调用deploy:start

在我的应用程序中,我没有迁移步骤,当我运行cap deploy:cold时,它会执行更新但是会显示:

* 2014-04-09 14:57:45 executing `deploy:migrate'
`deploy:migrate' is only run for servers matching {:roles=>:db, :only=>{:primary=>true}}, but no servers matched

并且未调用deploy:start。如果我手动调用它,它可以正常工作 - 但绝不会通过deploy:cold。我错过了什么?

1 个答案:

答案 0 :(得分:0)

问题在于Capistrano 2定义了一个名为deploy:migrate的默认任务,该任务被指定为仅针对角色:db运行。如果您在应用程序中没有该角色(大多数情况下没有),那么当deploy:migrate运行时,它将在缺少的角色上出错,并且这种错误通常会终止部署方案。

如果您有一个复杂的设置,其中某些任务仅针对特定服务器运行,则可能会发生其他任务。在Capistrano的网站上根本没有记录这种行为,这是一种耻辱。

从Capistrano 2.7开始,有一种规避"的方法只适用于匹配角色的服务器"错误,通过指定一个任务属性来告诉Capistrano如果没有服务器匹配任何指定的角色,则跳过任务:

例如:

namespace :deploy do
  task :stuff, :roles => :somerole, :on_no_matching_servers => :continue do
    # stuff
  end
end

现在这适用于自定义任务,但如何为默认任务migrate设置此项?您必须使用自己的设置覆盖任务并添加:on_no_matching_servers选项。我已将此添加到global.rb文件中:

namespace :deploy do
  task :migrate, :on_no_matching_servers => :continue do end
end