首页 > 解决方案 > 在 Azure Pipelines 中继续出错(但仍报告为错误)

问题描述

我有一个由 YAML 文件定义的 Azure Pipelines 管道,该文件可以编译、运行一些测试,然后发布测试结果。不编译显然是不可能运行测试的,所以编译任务显然是有continueOnError: false集合的。但是,我还是想在测试失败的时候发布测试结果,所以我设置continueOnErrortrue了测试任务下。

这似乎有效,直到我的一项测试失败。然后,Azure 并没有使构建失败,而是报告了一个警告。我怎样才能让它仍然错误整个构建但也执行剩余的任务?

标签: azureunit-testingcontinuous-integrationazure-pipelines

解决方案


我认为消除对几个 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领域的确切内容的文档有点差,但具体来说,我建议您参考条件表达式表达式#Job status check functions


推荐阅读