6

Djangoアプリをデプロイするためにfabfileをセットアップしようとしています。

このエラーが発生する理由がわかりません。

致命的なエラー:'git commit -m'の実行中にlocal()でエラー(リターンコード2)が発生しました。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'")  

Fabricからgitcommitを作成することは可能ですか?

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
理想的には、ファブリックタスク自体を変更しないでください。これにより、手動でテストしたのと同じファイルをファクトリにアップロードできます。

ファブリックソースをチェックして、「tests」フォルダー、具体的にはtests/utils.pyを調べます。@mock_streamsこれには、関数(Pythonコード内の任意の関数-前述のようにファブリック固有ではありません)をラップし、リダイレクト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 に答える