Почему Azure DevOps Server чередует выходные данные - PullRequest
0 голосов
/ 07 мая 2020

Заранее извините, я не могу опубликовать реальный код из-за ограничений безопасности на моей работе, но я постараюсь сделать надуманный пример.

Я работаю с python 3.6.1 и запуск модуля в конвейере Azure (ADS 2019). В модуле мы сделали вывод с использованием словаря со следующей структурой

#dummy data, assume files could be in any order in any category

{
    "compliant": ['file1.py', 'file2.py'], #list of files which pass
    "non-compliant":['file3.py'], #list of files which fail
    "incompatible":['file4.py'] #list of files which could not be tested due to exceptions
}

Когда происходит сбой, один из наших клиентов хочет, чтобы сценарий выводил команду для вызова сценария, который может быть запущен для исправления ошибки -соответствующие файлы. Программа написана аналогично следующему:

result = some_func() #returns the above dict
print('compliant:')

for file in result['compliant']:
    print(file)

print('non-compliant:')
for file in result['non-compliant']:
    print(file)

print('incompatible:')
for file in result['incompatible']:
    print(file)

# prints a string to sys.stderr simillar to python -m script arg1 arg2 ...
# script that is output is based on the arguments used to call
print_command_to_fix(sys.argv) 

При обычном запуске я бы получил правильный результат, как показано ниже:

#correct output: occurs on bash and cmd

compliant:
file1.py
file2.py
non-compliant:
file3.py
incompatible:
file4.py

python -m script arg1 arg2 arg_to_fix

при запуске на конвейере Azure, хотя вывод чередуется следующим образом:

#incorrect output: occurs only on azure pipeline runs

compliant:
python -m script arg1 arg2  arg_to_fix
file1.py
file2.py
non-compliant:
file3.py
incompatible:
file4.py

Пытаюсь ли я использовать print или sys.stderr.write, похоже, это не разрешает чередование, и я предполагаю, что print_command_to_fix () каким-то образом вызывается асинхронно . Но мое предположение, вероятно, неверно, поскольку я очень долго не работал с ADS или python.

TL; DR: Что я делаю не так, чтобы получить указанный выше чередующийся вывод только на конвейерах?

Редактировать: уточнены некоторые моменты и исправлены опечатки

1 Ответ

0 голосов
/ 09 мая 2020

Обнаружил ответ после нескольких часов поиска и устранения неисправностей и решений.

ADS отслеживает оба выходных потока в программе, но делает это асинхронно. Ошибка была вызвана выводом как на stdout, так и на stderr. В этом случае вывод всего вывода в один поток решил проблему. Подход, который я выбрал, оказался примерно таким:

result = some_func() #returns the above dict
output = []
output.append('compliant:')
output.extend(result['compliant'])

output.append(file)
output.extend(result['non-compliant'])

output.append('incompatible:')
output.extendresult['incompatible'])

# returns a string to simillar to python -m script arg1 arg2 ...
# script that is output is based on the arguments used to call
output.append(format_command_to_fix(sys.argv))
print('\n'.join(output))

В качестве альтернативы, я полагаю, что другие методы вывода асинхронной c информации также должны разрешиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...