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