Fabric error: Fatal error: local() encountered an error (return code 2) while executing 'git commit -m 'message'
I'm trying to setup a fabfile to deploy my Django app.
I can't figure out why I'm getting this error:
Fatal error: local() encountered an error (return code 2) while executing 'git commit -m 'changed settings for prodserver'
$ fab create_branch_deploy_to_prodserver
[localhost] run: git checkout prodserver_server
[localhost] run: git merge master
[localhost] run: cp settings_prodserver.py settings.py
[localhost] run: git add settings.py
[localhost] run: git commit -m 'changed settings for prodserver'
Fatal error: local() encountered an error (return code 1) while executing 'git commit -m 'changed settings for prodserver''
Aborting.
Here if the Fabric function:
def create_branch_deploy_to_prodserver():
local("git checkout prodserver_server")
local("git merge master")
local('cp settings_prodserver.py settings.py') #
#local('git rm fabfile.py') #This is also creating error so it's commented out
local('git add settings.py')
lo开发者_如何学JAVAcal("git commit -m 'changed settings for prodserver'")
Is it possible to make a git commit from Fabric?
I was able to diagnose the issue when I added capture=False to the declaration:
local('git rm fabfile.py', capture=False)
local('git add settings.py', capture=False)
This allowed the error to be displayed more verbosely.
Apparently, the maintainer of Fabric will to revert local
's behavior back to not capturing by default, in 1.0.
Is this a python-related issue like the one described in this thread?
The main problem with this is that the
stdout
/stderr
capturing is per-run/sudo invocation and not per-task.It would be wonderful if you could explain me how I could collect outputand error by only modifying the file called
fabfile_runner.py
.
Idealy the fabric task itself could be unmodified, this would allow to upload the the factory the same file that you have tested manually.Check out the Fabric source and look in the 'tests' folder, specifically tests/utils.py. It contains a single decorator,
@mock_streams
, which is capable of wrapping a function (any function in any Python code -- it's not Fabric specific, as I mentioned) and redirectingsys.stdout
and/orsys.stderr
for capture/examination.It's designed for use around functions, being a decorator, so you could use it directly by modifying your
fabfile_runner.py
like so:
fabfile_runner.py
from StringIO import StringIO
import sys
from test_fabfile import hello_world
def execute(task):
output = StringIO()
error = StringIO()
sys.stdout = output
sys.stderr = error
task()
sys.stdout = sys.__stdout__
sys.stderr = sys.__stderr__
return (output.getvalue(), error.getvalue())
output, error = execute(hello_world)
print "output : %s" %output
print "error : %s" %error
精彩评论