Ошибка ткани:Фатальная ошибка:local() обнаружил ошибку (код возврата 2) при выполнении 'git commit -m 'message'
Вопрос
Я пытаюсь настроить фабфайл для развертывания моего приложения Django.
Я не могу понять, почему я получаю эту ошибку:
Фатальная ошибка:local() обнаружил ошибку (код возврата 2) при выполнении 'git commit -m 'измененные настройки для 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.
Вот если функция 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'")
Можно ли сделать git-коммит из Fabric?
Решение
Мне удалось диагностировать проблему, добавив в объявление capture=False:
local('git rm fabfile.py', capture=False)
local('git add settings.py', capture=False)
Это позволило отображать ошибку более подробно.
Судя по всему, сопровождающий Fabric собирается вернуть local
поведение обратно к отключению захвата по умолчанию в версии 1.0.
Другие советы
Это проблема, связанная с Python, подобная описанной в эта тема?
Основная проблема при этом заключается в том, что
stdout
/stderr
захват осуществляется для каждого запуска/вызова sudo, а не для каждой задачи.Было бы замечательно, если бы вы объяснили мне, как я могу собирать выходи ошибка только изменив файл с именем
fabfile_runner.py
.
В идеале сама задача структуры должна быть неизмененной, это позволит загрузить на фабрику тот же файл, который вы протестировали вручную.Проверьте исходный код Fabric и загляните в папку «tests», в частности вtest/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