Capistrano:如何运行命令行rake任务并仅针对特定错误进行救援?

时间:2013-05-11 05:31:31

标签: ruby-on-rails ruby-on-rails-3 solr capistrano sunspot

在我们的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"

这有两个问题:

  1. 如果发生更严重的错误,它仍将继续运行,在这种情况下,我们希望部署停止。
  2. 打印出长而丑陋的错误跟踪。
  3. 我尝试将此命令放在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中的特定错误进行救援?理想情况下,我还想摆脱冗长,丑陋的错误跟踪,但那是当然是次要问题。

1 个答案:

答案 0 :(得分:0)

我没有回答你的问题,但是你可以确保命令不会尝试启动solr已经运行。

run "cd #{current_path} && if [ ! -f #{solr_pid} ]; then RAILS_ENV=#{rails_env} bundle exec rake sunspot:solr:start; fi

我假设有solr.pid(如果solr作为deamon运行它应该在那里)并且solr_pid是该pid的路径。

更新:您还可以使用ps aux检查solr进程是否真正在运行:

if ! ps aux | grep -q "[s]olr production" ; then echo 'solr not running'; fi

我在grep参数中使用[s],因为否则ps aux命令会自行捕获。我不确定找到solr进程的短语是什么,所以可能你必须使用更精确的东西。