5 votes

Gérer les échecs avec Fabric

J'essaie de gérer l'échec sur le tissu, mais l'exemple que j'ai vu dans la documentation était trop localisé à mon goût. J'ai besoin d'exécuter des actions de retour en arrière si l'une des actions échoue. J'ai essayé, alors, d'utiliser des contextes pour gérer cela, comme ceci :

@_contextmanager
def failwrapper():
    with settings(warn_only=True):
        result = yield
    if result.failed:
        rollback()
        abort("********* Failed to execute deploy! *********")

Et puis

@task
def deploy():
    with failwrapper():
        updateCode()
        migrateDb()
        restartServer()

Malheureusement, lorsque l'une de ces tâches échoue, je ne reçois rien sur result .

Existe-t-il un moyen d'y parvenir ? Ou existe-t-il un autre moyen de gérer de telles situations ?

7voto

Henri Siponen Points 441

D'après mes tests, vous pouvez y parvenir avec ceci :

from contextlib import contextmanager

@contextmanager
def failwrapper():
    try:
        yield
    except SystemExit:
        rollback()
        abort("********* Failed to execute deploy! *********")

Comme vous pouvez le voir, je me suis débarrassé du paramètre warn_only car je suppose que vous n'en avez pas besoin si le retour en arrière peut être exécuté et que vous interrompez l'exécution de toute façon avec abort().

Fabric lève une exception SystemExit lorsqu'il rencontre des erreurs et que le paramètre warn_only n'est pas utilisé. Nous pouvons simplement attraper l'exception et effectuer le retour en arrière.

1voto

Dave James Miller Points 1920

Dans le prolongement de la réponse d'Henri, cela permet également de gérer les interruptions de clavier (Ctrl-C) et autres exceptions :

@_contextmanager
def failwrapper():
    try:
        yield
    except:
        rollback()
        raise

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