Fabric错误:致命错误:local()在执行'git commit -m 'message'时遇到错误(返回码2)

6 投票
2 回答
15416 浏览
提问于 2025-04-15 16:50

我正在尝试设置一个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的默认行为改回不捕获错误。

撰写回答