2009-12-09 5 views
6

私はDjangoアプリケーションをデプロイするためにfabfileを設定しようとしています。ファブリック機能あればここでファブリックエラー:致命的なエラー: 'git commit -m'メッセージ 'の実行中にlocal()でエラーが発生しました(戻りコード2)

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. 

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'") 

が、gitのからコミットすることが可能です

私はこのエラーを取得しています理由を把握することはできませんファブリック?

答えて

6

私は宣言に= Falseのキャプチャを追加したとき、私は、問題を診断することができた:

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

これは、エラーが表示されることを許可もっと冗長に。

Fabricのメンテナーは、localの動作をデフォルトで1.0に戻すことに戻ります。

1

これはthis threadに記載されているようなPython関連の問題ですか?

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 redirecting sys.stdout and/or sys.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 
関連する問題