我有一个由YAML文件定义的Azure Pipelines管道,该文件可以编译,运行一些测试,然后发布测试结果。显然,不进行编译就不可能运行测试,因此编译任务显然设置了continueonError: false
。但是,我仍然想在测试失败时发布测试结果,因此我在测试任务下将continueonError
设置为true
。
这似乎很有效,直到我的一项测试失败。然后,Azure只是报告了警告,而不是使构建失败。我如何才能使它在整个构建过程中仍然出错,又执行其余任务?
我认为消除对几个 YAML 属性的确切作用的误解很有用(因为这也让我感到困惑)。该问题询问了现有答案未涵盖的 YAML 管道,所以我想我也可以举一个例子。
continueOnError
确定 当前 任务是在遇到错误(带有警告)时继续,还是立即失败。尽管该名称可能具有误导性,但它并不能(直接)确定是否继续执行后续任务。condition
决定任务是否运行。默认情况下,如果前一个任务失败,那么这个任务将不会运行。您可以覆盖它并让任务运行,而不管之前的失败如何。因此,如果您的测试失败,则没有必要使用 continueOnError
,只是为了运行 Publish Test Results 任务,您无论如何都可以让它运行。
我不确切知道您的管道是如何构建的,但希望这可以展示一个示例:
trigger:
- main
pool:
vmImage: ubuntu-latest
steps:
- script: 'echo "compiling....."; exit 0'
displayName: 'Compile'
- script: 'echo "testing....." ; exit 1' # exit 1" simulates task failure
displayName: 'Run Tests'
condition: succeeded()
- script: 'echo "publishing test results....."'
displayName: 'Publish Results'
condition: succeededOrFailed() # Run task even if previous ones fail
结果是整体流水线失败:
我们可以看到测试结果仍然发布在管道分解中(尽管前面的步骤失败了,这里不需要 continueOnError
):
您可以使用 YAML 示例中的退出代码来确定哪些任务失败。我发现有关 condition
字段中确切内容的文档有点糟糕,但我特别建议您参考 Conditions、Expressions 和 Expressions#Job status check functions。
如果编译任务始终成功运行,则可以使用默认条件。如果没有,我认为您可以使用自定义条件。例如,在编译任务之后添加一个任务以创建一个变量,然后将该变量的值用作发布测试结果的条件,例如and(succeeded(),eq(variables['variableName'],'variableValue'))
您可以指定任务或作业的运行条件。更详细的信息,您可以参考here。