Capistrano&Bash:忽略命令退出状态
我正在使用Capistrano运行远程任务。 我的任务是这样的:
task :my_task do run "my_command" end
我的问题是,如果my_command
的退出状态!= 0,那么Capistrano认为它失败并退出。 退出状态不为0时,如何让capistrano继续退出? 我已经将my_command
更改为my_command;echo
和它的工作,但它感觉像一个黑客。
最简单的方法就是将命令追加到最后。
task :my_task do run "my_command" end
变
task :my_task do run "my_command; true" end
对于Capistrano 3,你可以(如这里所build议的)使用以下内容:
execute "some_command.sh", raise_on_non_zero_exit: false
+ grep +命令根据find的内容退出非零。 在你关心输出但不介意是否为空的用例中,你会默默地放弃退出状态:
run %Q{bash -c 'grep #{escaped_grep_command_args} ; true' }
通常情况下,我认为第一个解决scheme就好 – 我会把它自己logging下来:
cmd = "my_command with_args escaped_correctly" run %Q{bash -c '#{cmd} || echo "Failed: [#{cmd}] -- ignoring."'}
如果您希望使用退出代码执行不同的操作,您需要修补Capistrano代码; 如果退出状态不为零,则会硬编码以引发exception。
这里是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
我find了最简单的select:
run "my_command || :"
注意::是NOP命令,所以退出代码将被忽略。
我只是将STDERR和STDOUTredirect到/ dev / null,所以你的
run "my_command"
变
run "my_command > /dev/null 2> /dev/null"
这适用于标准的unix工具,在这种情况下,cp或ln可能会失败,但是您不想停止部署这样的失败。
我不知道他们添加了这个代码的版本,但我喜欢用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中实现该function的地方。 https://github.com/capistrano/sshkit/blob/4cfddde6a643520986ed0f66f21d1357e0cd458b/lib/sshkit/command.rb#L94