【问题标题】:Skip a stage if the previous one has errors in Azure Pipeline Release如果上一个阶段在 Azure Pipeline Release 中有错误,则跳过一个阶段
【发布时间】:2020-05-20 12:19:23
【问题描述】:

我有一个非常简单的 Azure Pipeline Release,如果上一个有任何错误,我只想跳过一个阶段。我已经检查过https://docs.microsoft.com/en-us/azure/devops/pipelines/process/conditions?view=azure-devops&tabs=classic

将测试作业设置为“仅在所有以前的作业都成功时”运行无济于事

我的主要目标是在前一个阶段出现特定条件时跳过测试阶段,并且在阶段之间传递变量似乎是不可能的,也不能使用门,所以我必须考虑故意提出舞台上的错误。阶段运行一些 PS 脚本,我也不能让整个阶段都失败

Screen shot

【问题讨论】:

  • 如果您使用日志记录命令引发错误,则需要按照 Krzysztof Madej 的建议添加 exit1。此外,[此处](Krzysztof Madej) 记录了这一点。

标签: azure-devops azure-pipelines-release-pipeline


【解决方案1】:

阶段运行一些PS脚本,我不能让整个阶段失败 从那个

您是否正在使用 PowerShell 任务或类似任务?尝试编辑任务并启用Fail on Standard Error 选项:

如果有任何错误写入错误管道,该任务将失败。同样在测试阶段的预部署条件下,确保未选中 trigger when ... 复选框:

【讨论】:

  • 我试过Fail on STandard Error,但没有帮助。任务和整个阶段都在通过。
  • @KrzysztofMadej 嗨朋友,你能分享一些关于你的 PS 脚本(引发错误的脚本)是什么样子的细节吗?我正在尝试重现相同的问题并在我这边进行测试。 ps:投票给你的答案,因为我认为它很有意义。
  • 我首先尝试将throw exceptionexit 1 放入我的ps 脚本中。在这两种情况下,阶段都失败了。所以这不是一个原始案例。之后,我尝试了记录命令Write-Host "##vso[task.logissue type=error]Something went very wrong.",在这种情况下,我得到了错误报告,但任务或阶段没有失败。我知道这可能与问题中的情况不同。但至少我得到了同样的行为。之后我尝试检查Fail on Standard Error 并取消选中Continue on Error。但仍然构建通过。
  • 知道了,如果用户在使用 logging 命令时遇到错误,那么他应该总是添加一个额外的 exit1,就像 the document 所说的那样。
  • 是的。我同意。但我不知道这是否真的发生在@DavideBonavita 案例中。我只是用它来模拟行为。
【解决方案2】:

据我了解,您需要这样的东西feature。如您所见,这是不支持开箱即用的。

您可以使用 REST API 获取正在运行的发布状态并分析响应以验证 issueType = Error 是否存在任何问题。然后在这个脚本中你需要调用exit 1。这并不理想,但确实有效。

$uri = "https://vsrm.dev.azure.com/thecodemanual/Devops manual/_apis/release/releases/$(Release.ReleaseId)?api-version=5.1"

Write-Host $(Release.ReleaseId)
Write-Host $uri

# Invoke the REST call
$result = Invoke-RestMethod -Uri $uri -Method Get -Headers @{Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"}


$errors = @()

$result.environments |
    ForEach-Object { $_.deploySteps | 
        ForEach-Object { $_.releaseDeployPhases |
            ForEach-Object { $_.deploymentJobs |
                ForEach-Object { $_.tasks |
                    ForEach-Object { $errors += $_.issues | Where-Object { $_.issueType -eq "Error" } }}}}}

Write-Host $errors.Count

if($errors.Count -gt 0) {
    Write-Host Error
    exit 1
}

没有上面的步骤,我得到了这个:

通过这一步:

【讨论】:

    猜你喜欢
    • 2020-05-29
    • 2020-01-07
    • 2019-09-01
    • 1970-01-01
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    相关资源
    最近更新 更多