使用Fabric处理故障

Dan*_*ral 5 python deployment fabric

我正试图处理面料上的失败,但我在文档上看到的例子太过本地化,不符合我的口味.如果许多操作中的任何一个失败,我需要执行回滚操作.然后,我尝试使用上下文来处理它,如下所示:

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

然后

@task
def deploy():
    with failwrapper():
        updateCode()
        migrateDb()
        restartServer()
Run Code Online (Sandbox Code Playgroud)

不幸的是,当其中一个任务失败时,我什么都搞定了result.

有没有办法实现这个?或者还有另一种处理这种情况的方法吗?

小智 7

根据我的测试,你可以用这个完成:

from contextlib import contextmanager

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

正如你所看到的,我摆脱了warn_only设置,因为我认为你不需要它,如果可以执行回滚并且你正在使用abort()中止执行.

遇到错误时,Fabric会引发SystemExit异常,并且不使用warn_only设置.我们可以捕获异常并进行回滚.