6

我正在尝试设置一个 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.

这里如果织物功能:

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 提交?

4

2 回答 2

7

当我在声明中添加 capture=False 时,我能够诊断出问题:

local('git rm fabfile.py', capture=False)
local('git add settings.py', capture=False)

这允许更详细地显示错误。

显然,Fabric 的维护者将local在 1.0 中恢复默认不捕获的行为。

于 2009-12-09T19:17:34.413 回答
1

这是一个与 python 相关的问题,就像这个线程中描述的那样吗?

这样做的主要问题是stdout/stderr捕获是每次运行/sudo 调用而不是每个任务。

如果您能解释我如何通过修改名为. 理想情况下,可以不修改结构任务本身,这将允许将您手动测试过的相同文件上传到工厂。fabfile_runner.py

查看 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
于 2009-12-09T19:09:55.557 回答