Au fait, l'autre jour, j'ai eu l'occasion de faire voir mon message à un ami. "Kimoi, la photo est dégoûtante. Vraiment dégoûtante? Quelqu'un l'a-t-il déjà fait remarquer?" J'ai reçu un commentaire très apprécié.
fabric est un outil simple et très puissant.
Cependant, c'est aussi un outil dangereux selon la façon dont il est utilisé. Vous devez être très prudent, surtout quand il est utilisé par un déchet humain comme moi.
Voudrais-je déployer quelque chose d'étrange dans l'environnement de production aujourd'hui? Des gens étranges (patrons et autres) regardent les sacs à main saccadés.
Tu dois être prudent.
Cependant, quelle que soit votre attention, une erreur se produira. Par conséquent, vous devez gérer correctement les erreurs afin de ne pas casser diverses choses. Si vous obtenez une erreur quelque part après avoir modifié le fichier de paramètres Le démon n'a jamais redémarré car je n'ai changé que le fichier, Vous devez reculer pour que cela ne se produise pas.
Ensuite, ils reviennent à leur état d'origine et repartent comme si de rien n'était. C'est comme si un humain comme moi n'existait pas depuis le début.
La préface non pertinente est la plus longue, mais c'est une approche de retour en arrière du tissu.
Les bases du traitement de retour arrière lorsqu'une erreur se produit dans le fabric est de l'envelopper dans ʻenv.warn_only = True`. Essayez de ne pas abandonner soudainement, et si une erreur se produit, revenez en arrière avec précaution. C'est celui-là.
with settings(warn_only=True):
backup_important_file()
run('sed -e "s/foo/bar/g" important_file > tmp_file')
run('mv tmp_file important_file')
result = do_something_bad()
if result.return_code != 0:
# Rollbacking…
restore_important_file()
Cependant, il existe souvent plusieurs tâches exécutées par Fabric.
Si le traitement d'annulation requis pour chaque erreur de tâche est courant, Si vous l'implémentez docilement, cela ressemble à ceci, par exemple.
env.warn_only=True
def task1():
result = run('run command1')
if result.return_code != 0:
rollback()
def task2():
result = run('run command2')
if result.return_code != 0:
rollback()
def task3():
result = run('run command3')
if result.return_code != 0:
rollback()
def rollback():
# Rollbacking...
restore_everything()
@task
def do_it():
task1()
task2()
task3()
C'est souvent suffisant, mais une méthode un peu plus claire est possible.
En préparant une fonction wrapper et en utilisant le gestionnaire de contexte, Il est possible de combiner le traitement de restauration de plusieurs tâches.
Si le processus de restauration est commun à plusieurs tâches, C'est plus propre.
env.warn_only=False
def task1():
run('run command1')
def task2():
run('run command2')
def task3():
run('run command3')
def rollback():
# Rollbacking...
restore_everything()
@contextmanager
def rollbackwrap():
try:
yield
except SystemExit:
rollback()
abort("Error has occurred while running task!")
@task
def do_it():
with rollbackwrap():
task1()
task2()
task3()
task4()
Où vous souhaitez gérer les erreurs individuellement
with settings(warn_only=True):
Ce serait bon à utiliser.
J'ai beaucoup évoqué les articles suivants. http://awaseroot.wordpress.com/2012/06/05/fabric-wrappers-and-more-error-handling/
Recommended Posts