Fabric错误:致命错误:local()在执行'git commit -m 'message'时遇到错误(返回码2)
我正在尝试设置一个fabfile来部署我的Django应用。
我搞不清楚为什么会出现这个错误:
致命错误:local()在执行'git commit -m 'changed settings for prodserver'时遇到了错误(返回代码2)
$ 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.
这里是Fabric的函数:
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')
local("git commit -m 'changed settings for prodserver'")
从Fabric中进行git提交是可能的吗?
2 个回答
1
这是一个和Python有关的问题,类似于这个讨论串中描述的内容吗?
主要的问题在于,
stdout
(标准输出)和stderr
(标准错误)的捕获是针对每次运行或每次使用sudo命令的,而不是针对每个任务的。如果你能告诉我如何只通过修改一个叫做
fabfile_runner.py
的文件来收集输出和错误,那就太好了。
理想情况下,Fabric的任务本身不需要修改,这样你就可以上传和你手动测试过的同一个文件到工厂。你可以查看Fabric的源代码,看看'tests'文件夹,特别是tests/utils.py。里面有一个装饰器
@mock_streams
,它可以包装一个函数(任何Python代码中的任何函数——这并不是Fabric特有的,正如我提到的)并重定向sys.stdout
和/或sys.stderr
以便捕获和检查。这个装饰器是为了在函数周围使用的,所以你可以直接通过修改你的
fabfile_runner.py
来使用它,像这样:
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
7
我在声明中加上了capture=False后,成功找到了问题所在:
local('git rm fabfile.py', capture=False)
local('git add settings.py', capture=False)
这样做让错误信息显示得更详细了。
显然,Fabric的维护者打算在1.0版本中把local
的默认行为改回不捕获错误。