Ошибка ткани:Фатальная ошибка:local() обнаружил ошибку (код возврата 2) при выполнении 'git commit -m 'message'

StackOverflow https://stackoverflow.com/questions/1875306

  •  18-09-2019
  •  | 
  •  

Вопрос

Я пытаюсь настроить фабфайл для развертывания моего приложения 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top