Azure DevOps报告PowerShell任务已通过,即使有非0的退出代码。

9
在Azure DevOps中,我有一个任务要运行PowerShell脚本。在某些情况下,脚本应该以非0代码退出,导致任务被报告为失败。然而,Azure DevOps仍会将任务报告为已通过。
这是一个问题,因为我有一个后续作业,如果此作业失败,则应该运行,但由于虚假的积极结果,这并没有发生。

enter image description here

脚本相关部分显示,在屏幕截图的情况下,检测到退出码为1,这应该导致脚本出现错误而退出。
if ($exitCode -ne 0)
{
    Write-Output ("[Error] Failing task since return code was {0} while expected 0." -f $exitCode)
}
exit $exitCode

该任务作为部署工作的一部分运行,并且我已经将选项 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遵守我的退出代码?

我使用常规的PowerShell任务测试了一个类似的案例。它按预期工作。failOnStandardError标志实际上是在寻找写入错误流的内容。你需要使用Write-Error来强制执行。虽然我知道这不是你要求的。话虽如此,我认为问题出在该任务中未正确处理返回值。我看到他们可能会有关于该任务的该标志的问题 - Matt
如果是一个 bug,将其提到 Github 项目上可能是获得直接帮助的最佳途径。 - Matt
2个回答

12
似乎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、如果 exitCode的返回值为非0数,请使用日志命令##vso[task.complete result=Failed;]Failed手动将任务标记为失败。请参阅下方:

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

谢谢回复,我一有机会就尝试这些建议。 - David Gard
嗨,@DavidGard,你有机会尝试上面的内容了吗?进展如何? - Levi Lu-MSFT
刚刚测试了一下,选项一似乎能够完成任务。如果下周回到办公室时遇到任何问题,我会再添加进一步的评论。谢谢。 - David Gard

0

由于该解决方案对我并没有直接起作用,因此我进行了一些改进,并使用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)
      }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接