Capistrano のデプロイでは、(Sunspot gem を介して) Solr が実行されていることを確認するタスクがあります。
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"
これには 2 つの問題があります。
- より深刻なエラーが発生した場合でも実行を継続します。その場合、デプロイを停止します。
- 長くて醜いエラートレースを出力します。
このコマンドをブロックに入れて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
エラーは "failed: " の後に失敗したコマンドが続くだけなので、既に実行されているサーバーの良性のエラーと、おそらくより悪性の他のエラーを区別することはできません。また、長くて醜いエラートレースも出力されるため、どちらの問題も解決されません。
コマンドラインの rake タスクを実行し、Capistrano で特定のエラーに対してのみレスキューする方法はありますか? 理想的には、長く醜いエラー トレースも取り除きたいのですが、もちろんそれは二次的な問題です。