Fabric Fehler: Fatal error: local () ist ein Fehler aufgetreten (Return-Code 2), während der Ausführung ‚git commit -m 'message'
Frage
Ich versuche, eine fabfile Setup meiner Django App bereitstellen.
Ich kann nicht erklären, warum ich diesen Fehler bin immer:
Fatal error: local () ist ein Fehler aufgetreten (Returncode 2) während der Ausführung von ‚git commit -m 'geänderten Einstellungen für 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.
Hier, wenn der Stoff-Funktion:
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'")
Ist es möglich, ein git commit von Stoff zu machen?
Lösung
Ich war in der Lage, das Problem zu diagnostizieren, wenn ich capture = False auf die Erklärung hinzugefügt:
local('git rm fabfile.py', capture=False)
local('git add settings.py', capture=False)
Dies erlaubt der Fehler werden mehr verbosely angezeigt.
Anscheinend wird der Betreuer von Fabric local
das Verhalten wieder zurück zu standardmäßig nicht erfassen, in 1.0.
Andere Tipps
Ist das ein Python-verwandtes Thema wie die beschrieben in dieses Thema ?
Das Hauptproblem dabei ist, dass die
stdout
/stderr
Capturing ist pro-run / sudo Aufruf und nicht pro-Aufgabe.Es wäre schön, wenn Sie mir erklären, wie ich sammeln konnte Ausgang und Fehler , indem nur die Datei ändern genannt
fabfile_runner.py
.
Idealy den Stoff Aufgabe selbst unmodifiziert sein könnte, würde dies erlauben, die die Fabrik die gleiche Datei zu laden, die Sie manuell getestet haben.Überprüfen Sie den Stoff Quelle aus und schauen Sie in den Ordner ‚Tests‘, speziell Tests / utils.py. Es enthält eine einzelne Dekorateur,
@mock_streams
, die aus Einwickeln eine Funktion in der Lage ist (jede Funktion in jedem Python-Code - es ist nicht Stoff spezifisch, wie ich bereits erwähnt). Und Umleitungsys.stdout
und / odersys.stderr
für die Erfassung / PrüfungEs ist für den Einsatz rund um Funktionen ausgelegt ist, ein Dekorateur zu sein, so könnte man es direkt verwenden, indem Sie Ihre
fabfile_runner.py
wie so ändern:
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