#powershell #azure-devops #task
#powershell #azure-devops #задача
Вопрос:
В Azure DevOps у меня есть задача запустить сценарий PowerShell. В определенных сценариях сценарий должен завершаться с кодом, отличным от 0, в результате чего о задаче сообщается как о сбое. Однако Azure DevOps сообщает о задаче как о пройденной независимо.
Это проблема, потому что у меня есть последующее задание, которое должно выполняться в случае сбоя этого задания, но этого не происходит из-за ложного срабатывания.
Соответствующая часть сценария показывает, что в случае скриншота был обнаружен код выхода 1
, который должен привести к завершению сценария с ошибкой.
if ($exitCode -ne 0)
{
Write-Output ("[Error] Failing task since return code was {0} while expected 0." -f $exitCode)
}
exit $exitCode
Задача выполняется как часть deployment
задания, и у меня есть опция, failOnStandardError
установленная на true
.
- task: AzurePowerShell@5
displayName: Check Function App Version
inputs:
azureSubscription: ${{ parameters.serviceConnectionName }}
scriptType: FilePath
scriptPath: ${{ parameters.scriptsArtefactPath }}/Test-FunctionAppVersion.ps1
scriptArguments: -Uri ${{ parameters.healthCheckUri }} -AuthHeaderName Authorization -AuthHeaderValue "$(healthCheckAuthHeaderValue)"
failOnStandardError: true
azurePowerShellVersion: LatestVersion
pwsh: true
Как я могу заставить Azure DevOps соблюдать мои коды выхода?
Комментарии:
1. Я тестировал аналогичный случай с обычной задачей powershell. Все сработало, как ожидалось. Я думаю, что флаг failOnStandardError действительно ищет данные, записанные в поток ошибок. Вместо этого вам нужно будет выполнить ошибку записи, чтобы принудительно выполнить ее. Это не то, о чем вы просите, хотя я знаю. При этом, я думаю, что это связано с неправильной обработкой возврата в этой задаче. Я вижу, что в любом случае у них могут возникнуть проблемы с этим флагом для этой задачи.
2. Если это ошибка, лучшим способом получить прямое облегчение может быть ее повторное использование в проекте github.
Ответ №1:
Похоже, что у задачи Azure PowerShell возникла проблема с захватом кода выхода из файла сценария, она отлично работает со встроенными сценариями. Вы можете сообщить об этой проблеме команде разработчиков Microsoft. Надеюсь, они скоро предоставят исправление.
Однако вы можете использовать любое из приведенных ниже обходных путей, чтобы исправить это.
1, Используйте [Environment]::Exit($exitCode)
вместо exit
. Смотрите ниже:
if ($exitCode -ne 0)
{
Write-Output ("[Error] Failing task since return code was {0} while expected 0." -f $exitCode)
}
[Environment]::Exit($exitCode)
2, Используйте команду ведения журнала ##vso[task.complete result=Failed;]Failed
, чтобы вручную завершить выполнение задачи, если код выхода не равен 0. Смотрите ниже:
if ($exitCode -ne 0)
{
Write-Output ("[Error] Failing task since return code was {0} while expected 0." -f $exitCode)
Write-Host "##vso[task.complete result=Failed;]Failed"
}
exit $exitCode
Комментарии:
1. Спасибо за ответ, я попробую эти предложения, как только у меня появится такая возможность.
2. Привет, @DavidGard, У тебя была возможность попробовать вышеуказанный вариант. Как все прошло?
3. Протестировано только что, и первый вариант, похоже, справляется с задачей. Я добавлю дополнительный комментарий, если я столкнусь с какими-либо проблемами, когда вернусь в офис на следующей неделе. Спасибо.
Ответ №2:
Поскольку решение напрямую не сработало для меня, я немного улучшил это и использую Write-Error
вместо Write-Host
.
if ($exitCode -ne 0) {
Write-Error ("[Error] Failing task since return code was {0} while expected 0." -f $exitCode)
}
В сочетании с failOnStderr
вы получите то, что вам нужно.
- task: PowerShell@2
displayName: check stuff
inputs:
failOnStderr: true
targetType: 'inline'
script: |
do_some_thing
if ($exitCode -ne 0) {
Write-Error ("[Error] Failing task since return code was {0} while expected 0." -f $exitCode)
}