Python 用织物处理故障
我正在尝试处理fabric上的失败,但我在文档中看到的示例太本地化了,不适合我的口味。如果许多操作中的任何一个失败,我需要执行回滚操作。然后,我尝试使用上下文来处理它,如下所示:Python 用织物处理故障,python,deployment,fabric,Python,Deployment,Fabric,我正在尝试处理fabric上的失败,但我在文档中看到的示例太本地化了,不适合我的口味。如果许多操作中的任何一个失败,我需要执行回滚操作。然后,我尝试使用上下文来处理它,如下所示: @_contextmanager def failwrapper(): with settings(warn_only=True): result = yield if result.failed: rollback() abort("*********
@_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()
不幸的是,当其中一项任务失败时,我无法从结果中获得任何信息
有没有办法做到这一点?或者有其他方法来处理这种情况吗?根据我的测试,您可以通过以下方法来完成:
from contextlib import contextmanager
@contextmanager
def failwrapper():
try:
yield
except SystemExit:
rollback()
abort("********* Failed to execute deploy! *********")
正如您所看到的,我去掉了warn_only设置,因为我认为如果可以执行回滚并且您正在使用abort()中止执行,则不需要它
结构遇到错误时引发SystemExit异常,并且未使用仅警告设置。我们可以捕获异常并进行回滚。根据Henri的回答,这也可以处理键盘中断(Ctrl-C)和其他异常:
@_contextmanager
def failwrapper():
try:
yield
except:
rollback()
raise