我正在尝试处理 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
上没有得到任何信息。
有什么办法可以实现吗?还是有另一种方法来处理这种情况?
最佳答案
根据我的测试,你可以用这个来完成:
from contextlib import contextmanager
@contextmanager
def failwrapper():
try:
yield
except SystemExit:
rollback()
abort("********* Failed to execute deploy! *********")
如您所见,我去掉了 warn_only 设置,因为我认为如果可以执行回滚则不需要它,并且无论如何您都将使用 abort() 中止执行。
Fabric 在遇到错误时引发 SystemExit 异常并且未使用 warn_only 设置。我们可以捕获异常并进行回滚。
关于python - 使用 Fabric 处理故障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10827112/