Шаг конвейера Azure не выполняется, хотя код выхода равен 0

Я настроил конфигурацию yaml для Azure-pipe с конвейерным заданием, которое запускает 5 сценариев. Конфиг для каждого скрипта имеет failOnStderr флаг установлен в true, Сценарий выполняется успешно, однако этап завершается неудачно с выводом:

##[error]Bash wrote one or more lines to the standard error stream.

Я включил system.debug для многословия и получил дополнительные подробности как таковые:

##[debug]Exit code 0 received from tool '/bin/bash'
##[debug]STDIO streams have closed for tool '/bin/bash'
##[error]Bash wrote one or more lines to the standard error stream.
##[debug]Processed: ##vso[task.issue type=error;]Bash wrote one or more lines to the standard error stream.
##[debug]task result: Failed
##[debug]Processed: ##vso[task.complete result=Failed;done=true;]

У меня есть следующие вопросы:

  1. Почему код выхода 0 интерпретируется как ошибка?
  2. По какой-то причине за кулисами отправляется что-то еще со стандартной ошибкой?
  3. Какое решение / обходной путь рекомендует сообщество за пределами конфигурации, предлагаемой лазурными конвейерами? Я мог бы использовать снаряд trap но я надеялся найти что-то, что уменьшило бы шаблон сценариев.

0 ответов

У меня тоже были проблемы с failOnStderr и пришел к следующему:

я думаю что failOnStderr следует использовать только для обработки неработающих приложений, которые возвращают 0, но все равно дают сбой, и записывают причину этого сбоя в стандартный вывод.

В вашем случае сообщение об ошибке ##[error]Bash wrote one or more lines to the standard error stream. по крайней мере, дает причину, почему шаг не удался.

В моем случае сообщение об ошибке было ##[error]Script failed with error: Error: /bin/bash failed with return code: 0 который даже не упоминает тот факт, что он действительно потерпел неудачу из-за сообщения регистрации (не ошибки), выданного stderr.

Так

  1. Это не так. Сбой, потому что вы указали, что он должен потерпеть неудачу, если что-то было записано в stderr, что, кажется, имеет место
  2. Некоторые программы пишут сообщения регистрации в stderr (например, az --version выдает предупреждение stderr, если оно устарело)
  3. Я думаю, что самые простые решения следующие:
    • Если ваши скрипты не используют неработающие приложения, которые завершаются с ошибкой с кодом выхода 0, не используйте failOnStderr флаг
    • Если вам нужно / все еще хотите использовать failOnStderr, перенаправить stderr из тех команд, которые записывают свои сообщения регистрации в stderr (2 > /dev/null)
Другие вопросы по тегам