我正在使用Capistrano运行远程任务。我的任务看起来像这样:
task :my_task do
run "my_command"
end
我的问题是如果my_command
有退出状态!= 0,那么Capistrano认为它失败并退出。当退出状态不为0时,如何在退出时让capistrano继续运行?我已将my_command
更改为my_command;echo
并且它有效,但感觉就像是黑客。
答案 0 :(得分:76)
最简单的方法是将true追加到命令的末尾。
task :my_task do
run "my_command"
end
变为
task :my_task do
run "my_command; true"
end
答案 1 :(得分:35)
对于Capistrano 3,您可以(按照建议here)使用以下内容:
execute "some_command.sh", raise_on_non_zero_exit: false
答案 2 :(得分: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."'}
答案 3 :(得分: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
答案 4 :(得分:4)
我找到了最简单的选项:
run "my_command || :"
注意::
是NOP命令,因此退出代码将被忽略。
答案 5 :(得分:2)
我只是将STDERR和STDOUT重定向到/ dev / null,所以你的
run "my_command"
变为
run "my_command > /dev/null 2> /dev/null"
这很适用于标准的unix工具,比方说,cp或ln可能会失败,但你不想在这样的失败时暂停部署。
答案 6 :(得分:0)
我不确定他们添加此代码的版本,但我喜欢使用raise_on_non_zero_exit
namespace :invoke do
task :cleanup_workspace do
on release_roles(:app), in: :parallel do
execute 'sudo /etc/cron.daily/cleanup_workspace', raise_on_non_zero_exit: false
end
end
end
这是在gem中实现该功能的地方。 https://github.com/capistrano/sshkit/blob/4cfddde6a643520986ed0f66f21d1357e0cd458b/lib/sshkit/command.rb#L94