ruby-on-rails - para - instalar ruby on rails en windows 10
Capistrano & Bash: ignora el estado de salida del comando (7)
Acabo de redirigir STDERR y STDOUT a / dev / null, por lo que su
run "my_command"
se convierte
run "my_command > /dev/null 2> /dev/null"
esto funciona bastante bien para las herramientas estándar de Unix, donde, por ejemplo, cp o ln podría fallar, pero no desea detener la implementación en dicho error.
Estoy usando Capistrano para ejecutar una tarea remota. Mi tarea se ve así:
task :my_task do
run "my_command"
end
Mi problema es que si my_command
tiene un estado de salida! = 0, entonces Capistrano considera que falló y sale. ¿Cómo puedo hacer que el capistrano siga funcionando cuando sale cuando el estado de salida no es 0? Cambié my_command
a my_command;echo
y funciona, pero se siente como un truco.
Necesitará parchar el código de Capistrano si quiere que haga cosas diferentes con los códigos de salida; está codificado para generar una excepción si el estado de salida no es cero.
Aquí está la parte relevante de lib / capistrano / command.rb. La línea que comienza con if (failed
... is the important one) Básicamente dice que si hay valores de retorno distintos de cero, genera un error.
# 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
El comando + grep + sale de cero en función de lo que encuentre. En el caso de uso, donde le importa la salida pero no le importa si está vacía, descartará el estado de salida en silencio:
run %Q{bash -c ''grep #{escaped_grep_command_args} ; true'' }
Normalmente, creo que la primera solución está bien, la haría documentarse solo si:
cmd = "my_command with_args escaped_correctly"
run %Q{bash -c ''#{cmd} || echo "Failed: [#{cmd}] -- ignoring."''}
Encuentro la opción más fácil para hacer esto:
run "my_command || :"
Aviso:: es el comando NOP por lo que el código de salida simplemente se ignorará.
Para Capistrano 3, puede (como se sugiere aquí ) usar lo siguiente:
execute "some_command.sh", raise_on_non_zero_exit: false
La forma más simple es simplemente anexar verdadero al final de su comando.
task :my_task do
run "my_command"
end
Se convierte
task :my_task do
run "my_command; true"
end
No estoy seguro de qué versión agregaron este código, pero me gusta manejar este problema usando 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
Aquí es donde se implementa esa característica en la gema. https://github.com/capistrano/sshkit/blob/4cfddde6a643520986ed0f66f21d1357e0cd458b/lib/sshkit/command.rb#L94