我正在使用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
。我错过了什么?
答案 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