Handling failures with Fabric

deployment, fabric, python

Solution

According to my tests, you can accomplish that with this:

from contextlib import contextmanager

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

As you can see I got rid of the warn_only setting as I suppose you don't need it if the rollback can be executed and you're aborting the execution anyway with abort().

Fabric raises SystemExit exception when encountering errors and warn_only setting is not used. We can just catch the exception and do the rollback.

Problem

I'm trying to handle failure on fabric, but the example I saw on the docs was too localized for my taste. I need to execute rollback actions if any of a number of actions fail. I tried, then, to use contexts to handle it, like this: ``` @_contextmanager def failwrapper(): with settings(warn_only=True): result = yield if result.failed: rollback() abort("********* Failed to execute deploy! *********") ``` And then ``` @task def deploy(): with failwrapper(): updateCode() migrateDb() restartServer() ``` Unfortunately, when one of these tasks fail, I do not get anything on `result`. Is there any way of accomplishing this? Or is there another way of handling such situations?

Original source