使用Fabric处理故障

时间:2012-05-31 03:35:53

标签: python deployment fabric

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

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

然后

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

不幸的是,当其中一个任务失败时,我在result上没有得到任何内容。

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

2 个答案:

答案 0 :(得分:7)

根据我的测试,你可以用这个来实现:

from contextlib import contextmanager

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

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

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

答案 1 :(得分:1)

根据Henri的回答,这也处理键盘中断(Ctrl-C)和其他例外:

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