48 votes

Capistrano & Bash: commande ignorer statut de sortie

Je suis l'aide de Capistrano exécuter une tâche à distance. Ma tâche ressemble à ceci:

task :my_task do
  run "my_command"
end

Mon problème est que si my_command a une sortie de statut != 0, alors Capistrano estime qu'il a échoué et les sorties. Comment puis-je faire capistrano continuer quand la sortie lorsque le statut de sortie n'est pas à 0? J'ai changé d' my_command de my_command;echo et cela fonctionne, mais il se sent comme un hack.

77voto

mthorley Points 693

Le plus simple est de simplement ajouter vrai à la fin de votre comamnd.

  task :my_task do
    run "my_command"
  end

Devient

  task :my_task do
    run "my_command; true"
  end

37voto

Ciryon Points 1103

Pour Capistrano 3, vous pouvez (comme expliqué ici) utiliser les éléments suivants:

execute "some_command.sh", raise_on_non_zero_exit: false

6voto

mrflip Points 695

Le +grep+ commande ferme de non-zéro, selon ce qu'il trouve. Dans le cas où vous vous souciez de la sortie, mais ne me dérange pas si elle est vide, vous allez jeter la sortie de l'état en silence:

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

Normalement, je pense que la première solution est tout simplement parfait -- je voudrais faire du document lui-même tho:

cmd = "my_command with_args escaped_correctly"
run %Q{bash -c '#{cmd} || echo "Failed: [#{cmd}] -- ignoring."'}

5voto

Sarah Mei Points 10673

Vous aurez besoin de patcher le Capistrano code si vous souhaitez faire des choses différentes avec les codes de sortie, c'est codé en dur pour lever une exception si le statut de sortie n'est pas nulle.

Voici la partie pertinente de lib/capistrano/commande.rb. La ligne commençant par if (failed... est le plus important. Fondamentalement, il dit si il y a toute différente de zéro les valeurs de retour, générer une erreur.

# 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

4voto

Besi Points 9452

J'ai trouver la solution la plus simple pour ce faire:

run "my_command || :"

Avis: : est l'avis d'intention de commande de sorte que le code de sortie seront tout simplement ignorées.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X