50

リモートタスクを実行するカピストラーノを使用しています。私のタスクは次のようになります。

task :my_task do
  run "my_command"
end

私の問題はmy_command、終了ステータスが != 0 の場合、Capistrano は失敗したと見なして終了することです。終了ステータスが0でない場合、終了時にカピストラーノを継続させるにはどうすればよいですか? に変更my_commandしましmy_command;echoたが、動作しますが、ハックのように感じます。

4

7 に答える 7

79

最も簡単な方法は、コマンドの最後に true を追加することです。

  task :my_task do
    run "my_command"
  end

なる

  task :my_task do
    run "my_command; true"
  end
于 2009-08-25T14:19:53.920 に答える
40

Capistrano 3 の場合、(ここで提案されているように) 以下を使用できます。

execute "some_command.sh", raise_on_non_zero_exit: false
于 2014-05-02T08:49:46.957 に答える
6

+grep+ コマンドは、検出内容に基づいて非ゼロで終了します。出力を気にするが、それが空であっても気にしないユースケースでは、終了状態を静かに破棄します。

run %Q{bash -c 'grep #{escaped_grep_command_args} ; true' }

通常、最初の解決策は問題ないと思います-それ自体を文書化します:

cmd = "my_command with_args escaped_correctly"
run %Q{bash -c '#{cmd} || echo "Failed: [#{cmd}] -- ignoring."'}
于 2009-04-21T19:09:42.503 に答える
5

これを行う最も簡単なオプションを見つけます:

run "my_command || :"

注意::は NOP コマンドであるため、終了コードは単純に無視されます。

于 2012-07-11T08:17:13.653 に答える
5

終了コードで別のことをしたい場合は、Capistrano コードにパッチを当てる必要があります。終了ステータスがゼロでない場合に例外を発生させるようにハードコーディングされています。

lib/capistrano/command.rb の関連部分を次に示します。...で始まる行がif (failed重要です。基本的に、ゼロ以外の戻り値がある場合はエラーが発生します。

# Processes the command in parallel on all specified hosts. If the command
# fails (non-zero return code) on any of the hosts, this will raise a
# Capistrano::CommandError.
def process!
  loop do
    break unless process_iteration { @channels.any? { |ch| !ch[:closed] } }
  end

  logger.trace "command finished" if logger

  if (failed = @channels.select { |ch| ch[:status] != 0 }).any?
    commands = failed.inject({}) { |map, ch| (map[ch[:command]] ||= []) << ch[:server]; map }
    message = commands.map { |command, list| "#{command.inspect} on #{list.join(',')}" }.join("; ")
    error = CommandError.new("failed: #{message}")
    error.hosts = commands.values.flatten
    raise error
  end

  self
end
于 2009-04-17T04:57:43.273 に答える
2

STDERR と STDOUT を /dev/null にリダイレクトするだけなので、

run "my_command"

になる

run "my_command > /dev/null 2> /dev/null"

これは、たとえば cp や ln が失敗する可能性がある標準の UNIX ツールでは非常にうまく機能しますが、そのような失敗で展開を停止したくはありません。

于 2009-04-17T05:17:27.530 に答える