[PYTHON] Revenir en arrière lorsqu'une erreur se produit avec le tissu

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.

Manière de base

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.

Comment préparer un emballage

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.

référence

J'ai beaucoup évoqué les articles suivants. http://awaseroot.wordpress.com/2012/06/05/fabric-wrappers-and-more-error-handling/

Recommended Posts

Revenir en arrière lorsqu'une erreur se produit avec le tissu
Un mémorandum lorsqu'une erreur se produit avec pip install
Que faire lorsqu'une erreur se produit avec import _ssl
[Beanstalk] Que faire lorsqu'une erreur se produit avec import uuid
Solution lorsqu'une erreur se produit lors du masquage de l'écran de la console avec PyInstaller
J'ai eu une erreur lors de l'enregistrement avec OpenCV
Que faire si une erreur se produit lors de l'importation de numpy avec VScode
Une erreur se produit lors de l'importation de japandas (problème non résolu)
Une erreur se produit lors de la tentative d'importation de scikit-learn après la connexion à Oracle avec SQL Alchemy
J'ai eu une erreur lors de l'utilisation de Tensorboard avec Pytorch
Erreur lors de la lecture avec python
Lorsqu'une erreur _sqlite3 se produit dans la couverture
Quand j'obtiens une erreur avec Pylint sur Windows Atom
J'obtiens une erreur en essayant d'installer maec 4.0.1.0 avec pip
J'obtiens une erreur avec les pandas d'importation.
Créer une visionneuse de traitement d'image avec PySimpleGUI
Remarques lors de la création d'un environnement avec python
[Archlinux] Solution lorsqu'une erreur de requête de package se produit
[OSX] [pyenv] Que faire lorsqu'une erreur SSL se produit dans pip
[AWS] Comment gérer WordPress "Une erreur s'est produite lors du recadrage d'une image."
Que faire si une erreur se produit lorsque vous chargez un projet Python créé avec de la poésie dans VS Code
Solution de contournement si vous obtenez une erreur lors de la tentative d'installation de PySide avec pip
J'ai eu une erreur lorsque j'ai mis opencv dans python3 avec Raspeye [Remedy]
[python] Que faire si vous obtenez une erreur avec send_keys dans le chrome sans tête
Que faire si vous obtenez une erreur lors de l'installation de python avec pyenv
Si vous obtenez une longue erreur lors de la tabulation d'un shell interactif avec Anaconda
Erreur lors de l'installation d'un module avec Python pip
Écrivons FizzBuzz avec une erreur: Version Python
Erreur lors de l'entrée dans un environnement virtuel avec la commande workon
J'obtiens une erreur avec toutes les commandes yum
[Python] Erreur de type: l'objet 'WebElement' n'est pas itérable Que faire lorsqu'une erreur se produit
Que faire si vous obtenez une erreur OpenSSL lors de l'installation de Python 2 avec pyenv
Que faire si vous obtenez une erreur d'importation lors de l'importation de matplotlib avec Jupyter
J'ai eu une erreur lorsque j'installe des pandas sur Mac, alors je l'ai traitée
Une histoire sur une erreur lors du chargement d'un modèle TensorFlow créé avec Google Colab localement
Introduction au traitement parallèle distribué Python par Ray
J'obtiens une erreur lorsque je mets opencv dans pyautoGUI
Créer un environnement pour le traitement du langage naturel avec Python
Lors de l'écriture d'une instruction if avec une expression régulière
Lorsqu'une erreur se produit dans le scraping python (requêtes)
J'ai eu une erreur lorsque j'ai installé tweepy sur macOS Sierra, alors je l'ai résolue.
(Vagrant) Erreur de réponse à l'autorisation refusée (publickey, gssapi-keyex, gssapi-with-mic) qui se produit lors de la connexion à SSH
Que faire si vous obtenez une erreur non définie lorsque vous essayez d'utiliser pip avec pyenv