Azure Создание конвейера DevOps Makefile - PullRequest
0 голосов
/ 06 февраля 2020

Я пытаюсь настроить конвейер сборки Azure DevOps для CI C проекта, созданного с использованием gnu make, который в конечном итоге запускает g cc для компиляции и компоновки.

Хотя Я не был уверен, какую задачу добавить в конвейер для создания проекта Makefile, я попытался выполнить простую задачу «Сценарий командной строки», в которой он просто выполняет make в соответствующем каталоге.

проблема заключается в обнаружении сбоя сборки. В задаче «Сценарий командной строки» в разделе «Дополнительно» есть только параметр «Ошибка при стандартной ошибке». В описании говорится, что если что-то записано в stderr, задача завершится неудачей.

Так что, если возникает ошибка компиляции или ссылки, задача действительно не выполняется, что является желаемым поведением. Однако g cc также записывает все предупреждения компиляции в stderr, что также приводит к сбою задачи, а это не то, что нам нужно.

Отсутствие проверки «Сбой при стандартной ошибке» приводит к сборка помечается как успешная независимо от количества реальных ошибок.

Когда эта же сборка была запущена как часть задания Jenkins, она каким-то образом могла правильно интерпретировать вывод gcc / make и завершить сборку, только если были зарегистрированы фактические ошибки. Есть ли способ повторить такое же поведение в Azure конвейерах? Если не считать исправления всех предупреждений или перепроектирования процесса сборки, чтобы ничего не записывать в stderr, а затем использовать другие средства для проверки успешности сборки?

1 Ответ

0 голосов
/ 06 февраля 2020

Задача «Сценарий командной строки» просто запускает предоставленный сценарий как сценарий оболочки и проверяет его код завершения (ненулевое значение означает ошибку). Дело в том, что код выхода скрипта является кодом выхода последнего оператора, и по умолчанию (если не указана опция -e) оболочка будет работать независимо от ошибок, а именно:

Сбой команды

Содержание шага:

make -f nonexisting.mk

Результат:

========================== Starting Command Output ===========================
/bin/bash --noprofile --norc /home/vsts/work/_temp/bc2da066-dd8a-432d-b15f-b9c2bf7a8e1f.sh
make: nonexisting.mk: No such file or directory
make: *** No rule to make target 'nonexisting.mk'.  Stop.
##[error]Bash exited with code '2'.
Finishing: Command Line Script

Команде make не удалось вернуть код завершения 2, и задача была помечена как неудачная. Следующие задачи были пропущены.

Ошибка команды перезаписана следующим оператором

Содержание шага:

make -f nonexisting.mk
echo Do whatever else

Результат:

========================== Starting Command Output ===========================
/bin/bash --noprofile --norc /home/vsts/work/_temp/0b2ceea2-2821-4866-83c7-5d37a832ffe5.sh
make: nonexisting.mk: No such file or directory
make: *** No rule to make target 'nonexisting.mk'.  Stop.
Do whatever else
Finishing: Command Line Script

make команда не удалось, но оболочка перешла к следующему оператору (echo), который был успешным, следовательно, код завершения был 0, задача не была обнаружена, и конвейер успешно выполнен.

Включение остановки оболочки при ошибках

Содержание шага:

set -e
make -f nonexisting.mk
echo Do whatever else

Результат:

========================== Starting Command Output ===========================
/bin/bash --noprofile --norc /home/vsts/work/_temp/7f6644d3-408c-4b5b-b4d3-1f544e8a80ec.sh
make: nonexisting.mk: No such file or directory
make: *** No rule to make target 'nonexisting.mk'.  Stop.
##[error]Bash exited with code '2'.
Finishing: Command Line Script

Оболочке было разрешено завершить работу при любой обнаруженной ошибке; при сбое команды make выполнение сценария прекращается, команда echo не выполняется, а код выхода является кодом завершения сбойной команды. Это снова обнаруживается задачей, и конвейер завершается.

Кстати. Это стандартный способ, которым Jenkins запускает сценарии оболочки, по умолчанию передавая -e, поэтому он работает на Jenkins без каких-либо явных действий.

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

...