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设置.我们可以捕获异常并进行回滚.