Код завершения 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.

Другие вопросы по тегам