【发布时间】:2013-05-05 20:04:32
【问题描述】:
在我们的 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 中的特定错误进行救援? 理想情况下,我还想摆脱长而丑陋的错误跟踪,但仅此而已当然是次要的问题。
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3 solr capistrano sunspot