[PYTHON] Rollback, wenn beim Stoff ein Fehler auftritt

Neulich hatte ich übrigens die Gelegenheit, einen Freund meinen Beitrag sehen zu lassen. "Kimoi, das Bild ist ekelhaft. Wirklich ekelhaft? Hat jemals jemand darauf hingewiesen?" Ich habe einen hochgelobten Kommentar erhalten.

Stoff ist ein einfaches und sehr leistungsfähiges Werkzeug.

Es ist jedoch auch ein gefährliches Werkzeug, je nachdem, wie es verwendet wird. Sie müssen sehr vorsichtig sein, besonders wenn es von einem menschlichen Abfall wie mir verwendet wird.

Möchte ich heute etwas Seltsames in der Produktionsumgebung bereitstellen? Seltsame Leute (Chefs und andere) beobachten, wie die Handtaschen ruckeln.

Du musst vorsichtig sein.

Egal wie vorsichtig Sie sind, es tritt ein Fehler auf. Daher müssen Sie eine ordnungsgemäße Fehlerbehandlung durchführen, um verschiedene Dinge nicht zu beschädigen. Wenn Sie irgendwo nach dem Bearbeiten der Einstellungsdatei eine Fehlermeldung erhalten Der Daemon wurde nie wieder gestartet, da ich nur die Datei geändert habe. Sie müssen zurückrollen, damit es nicht passiert.

Dann kehren sie in ihren ursprünglichen Zustand zurück und gehen, als wäre nichts passiert. Es ist, als ob ein Mensch wie ich von Anfang an nicht existiert hätte.

Das irrelevante Vorwort ist das schlechteste lange, aber es ist ein Stoff-Rollback-Ansatz.

Grundlegender Weg

Die Grundlagen der Rollback-Verarbeitung, wenn ein Fehler in Fabric auftritt, bestehen darin, ihn in "env.warn_only = True" zu verpacken. Versuchen Sie, nicht plötzlich abzubrechen. Wenn ein Fehler auftritt, rollen Sie vorsichtig zurück. Das ist der eine.

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()

Es gibt jedoch häufig mehrere Aufgaben, die von Fabric ausgeführt werden.

Wenn die für jeden Aufgabenfehler erforderliche Rollback-Verarbeitung häufig ist, Wenn Sie es gehorsam implementieren, sieht es zum Beispiel so aus.

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()

Dies ist oft ausreichend, aber eine etwas klarere Methode ist möglich.

So bereiten Sie eine Verpackung vor

Durch Vorbereiten einer Wrapper-Funktion und Verwenden des Kontextmanagers Es ist möglich, die Rollback-Verarbeitung mehrerer Aufgaben zu kombinieren.

Wenn der Rollback-Prozess mehreren Aufgaben gemeinsam ist, Das ist sauberer.

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()

Wo Sie Fehler individuell behandeln möchten

with settings(warn_only=True):

Es wäre gut zu benutzen.

Referenz

Ich habe sehr viel auf die folgenden Artikel verwiesen. http://awaseroot.wordpress.com/2012/06/05/fabric-wrappers-and-more-error-handling/

Recommended Posts

Rollback, wenn beim Stoff ein Fehler auftritt
Ein Memorandum, wenn bei der Pip-Installation ein Fehler auftritt
Was tun, wenn beim Importieren von _ssl ein Fehler auftritt?
[Beanstalk] Was tun, wenn beim Importieren der UUID ein Fehler auftritt?
Lösung, wenn beim Ausblenden des Konsolenbildschirms mit PyInstaller ein Fehler auftritt
Beim Speichern mit OpenCV ist ein Fehler aufgetreten
Was tun, wenn beim Importieren von numpy mit VScode ein Fehler auftritt?
Beim Importieren von Japanern tritt ein Fehler auf (Problem ungelöst)
Beim Importieren von scikit-learn nach dem Herstellen einer Verbindung mit Oracle mit SQL Alchemy tritt ein Fehler auf
Bei der Verwendung von Tensorboard mit Pytorch ist ein Fehler aufgetreten
Fehler beim Spielen mit Python
Wenn ein _sqlite3-Fehler in der Abdeckung auftritt
Wenn ich eine Fehlermeldung mit Pylint unter Windows Atom erhalte
Beim Versuch, maec 4.0.1.0 mit pip zu installieren, wird eine Fehlermeldung angezeigt
Ich erhalte eine Fehlermeldung beim Import von Pandas.
Erstellen Sie mit PySimpleGUI einen Bildverarbeitungs-Viewer
Hinweise beim Erstellen einer Umgebung mit Python
[Archlinux] Lösung, wenn ein Paketabfragefehler auftritt
[OSX] [pyenv] Was tun, wenn in pip ein SSL-Fehler auftritt?
[AWS] Umgang mit WordPress "Beim Zuschneiden eines Bildes ist ein Fehler aufgetreten."
Was tun, wenn beim Laden eines mit Poesie erstellten Python-Projekts in VS Code ein Fehler auftritt?
Problemumgehung, wenn beim Versuch, PySide mit pip zu installieren, eine Fehlermeldung angezeigt wird
Ich habe eine Fehlermeldung erhalten, als ich opencv mit Raspeye in Python3 eingefügt habe [Remedy]
[Python] Was tun, wenn bei send_keys in Headless Chrome ein Fehler auftritt?
Was tun, wenn bei der Installation von Python mit pyenv eine Fehlermeldung angezeigt wird?
Wenn beim Tippen einer interaktiven Shell mit Anaconda eine lange Fehlermeldung angezeigt wird
Fehler beim Installieren eines Moduls mit Python pip
Schreiben wir FizzBuzz mit einem Fehler: Python-Version
Fehler beim Aufrufen einer virtuellen Umgebung mit dem Befehl workon
Ich erhalte eine Fehlermeldung mit allen yum-Befehlen
[Python] Typ Fehler: 'WebElement'-Objekt ist nicht iterierbar Was tun, wenn ein Fehler auftritt?
Was tun, wenn bei der Installation von Python 2 mit pyenv ein OpenSSL-Fehler auftritt?
Was tun, wenn beim Importieren von matplotlib mit Jupyter ein Importfehler auftritt?
Ich habe eine Fehlermeldung erhalten, als ich Pandas auf einem Mac installiert habe, also habe ich mich damit befasst
Eine Geschichte über einen Fehler beim Laden eines TensorFlow-Modells, das lokal mit Google Colab erstellt wurde
Einführung in die verteilte Parallelverarbeitung von Python durch Ray
Ich erhalte eine Fehlermeldung, wenn ich opencv in pyautoGUI einfüge
Erstellen einer Umgebung für die Verarbeitung natürlicher Sprache mit Python
Beim Schreiben einer if-Anweisung mit einem regulären Ausdruck
Wenn beim Python-Scraping ein Fehler auftritt (Anforderungen)
Ich habe eine Fehlermeldung erhalten, als ich tweepy unter macOS Sierra installiert habe, also habe ich mich damit befasst.
(Vagrant) Antwort auf verweigerte Berechtigung (publickey, gssapi-keyex, gssapi-with-mic) Fehler, der beim Herstellen einer Verbindung zu SSH auftritt
Was tun, wenn beim Versuch, pip mit pyenv zu verwenden, ein undefinierter Fehler angezeigt wird?