在我们的 Capistrano 部署中,我们有一个任务来确保我们的 Solr(通过 Sunspot gem)正在运行:
run "cd #{current_path} && RAILS_ENV=#{rails_env} bundle exec rake sunspot:solr:start"
但是,如果 Solr 已经在运行,这将引发错误,终止部署,因此我们添加; true
到命令的末尾以便 Capistrano 完成:
run "cd #{current_path} && RAILS_ENV=#{rails_env} bundle exec rake sunspot:solr:start; true"
这有两个问题:
- 如果发生更严重的错误,它仍然会继续运行,在这种情况下,我们希望部署停止。
- 它打印出一个又长又丑的错误跟踪。
我试过把这个命令放在一个begin … rescue
块中,然后像这样匹配消息:
begin
run "cd #{current_path} && RAILS_ENV=#{rails_env} bundle exec rake sunspot:solr:start"
rescue RuntimeError => failure
if failure.message =~ /#{text_to_match}/
logger.debug "Solr is already running: continuing"
else
raise failure
end
end
不幸的是,message
错误只是“失败:”,然后是失败的命令,这使我无法区分已经运行的服务器的良性错误和可能更恶性的其他错误。它还仍然打印出又长又丑的错误跟踪,所以我的问题都没有解决。
有没有办法运行命令行 rake 任务并仅针对 Capistrano 中的特定错误进行救援?理想情况下,我还想摆脱长而丑陋的错误跟踪,但这当然是次要的问题。