Код завершения PowerShell всегда равен 0 на этапе сборки TeamCity
У меня есть шаг сборки TeamCity, который запускает скрипт PowerShell (.ps1), который выглядит следующим образом:
try
{
# Break something
$a = 1 / 0
}
catch
{
Exit 1
}
Несмотря на это, в журнале сборки этот шаг завершается успешно и завершается с кодом 0.
[10:02:18] [Шаг 2/3] Процесс завершен с кодом 0
Я хочу, чтобы шаг потерпел неудачу, если в скрипте есть ошибки. Как я могу сделать это?
Мы используем TeamCity Enterprise 8.0.5.
2 ответа
Я только что опубликовал этот пост:
https://youtrack.jetbrains.com/issue/TW-21554
В teamcity есть ошибка, которая означает, что ненулевые коды возврата powershell не подобраны.
Предлагаемое решение заключается в создании условия сбоя сборки при обнаружении определенного вывода текста в журнал сборки.
Однако мое решение включало в себя что-то другое.
В блоке catch вы должны использовать только командлет Write-Error:
catch
{
Write-Error -Exception $_.Exception
}
Затем вы должны убедиться, что в TeamCity правильно установлены две вещи:
Во-первых, для шага сборки Error Output необходимо установить error, а не предупреждение:
Во-вторых, на экране условий сбоя сборки убедитесь, что сообщение об ошибке записывается в журнал запуска сборщика:
Надеюсь, это кому-нибудь поможет.
Предположим, вы используете psake, и ваша цель - провалить сборку в случае сбоя скрипта сборки. Скрипт, который импортирует модуль psake и вызывает скрипт сборки, не завершается неудачей, поэтому teamcity считает его успешной сборкой. Добавьте этот код в ваш первый скрипт, чтобы потерпеть неудачу при сборке, если второй скрипт потерпит неудачу
Import-Module .\psake\psake.psm1
Invoke-Psake .\build-steps.ps1 @args
if($psake.build_success -eq $false){
write-host "There was an error running psake script"
exit 1
}
Remove-Module psake
Не удаляйте модуль перед оператором If.