在 Azure Pipelines 中继续出错(但仍报告为错误)

Ian*_*Ian 4 continuous-integration unit-testing azure azure-pipelines

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

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

Wil*_*rop 6

我认为消除对几个 YAML 属性的确切作用的误解很有用(因为这也让我感到困惑)。该问题询问了现有答案未涵盖的 YAML 管道,所以我想我也可以举一个例子。

  • continueOnError确定当前任务在遇到错误(带有警告)时是否继续,或者是否立即失败。尽管该名称可能具有误导性,但它不会(直接)确定是否继续执行后续任务。
  • condition决定任务是否运行。默认情况下,如果前一个任务失败,那么这个任务将不会运行。您可以覆盖它并让任务运行,而不管早​​期的故障如何。

因此,continueOnError如果您的测试失败,则没有必要使用它,只是为了运行发布测试结果任务,您无论如何都可以运行它。

我不知道你的管道是如何构建的,但希望这能展示一个例子:

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
Run Code Online (Sandbox Code Playgroud)

结果是整个管道都失败了:

整体管道故障

我们可以看到测试结果仍然发布在管道分解中(尽管前面的步骤失败了,这里不需要continueOnError):

详细的管道细分

您可以使用 YAML 示例中的退出代码来确定哪些任务失败。我发现有关该condition领域的确切内容的文档有点差,但具体而言,我会向您推荐ConditionExpressionsExpressions#Job status check functions


小智 5

您可以如下设置发布测试结果任务的控制选项。 在此输入图像描述

然后你会得到这样的结果。 在此输入图像描述

如果您的编译任务始终运行成功,则可以使用默认条件。如果没有,我认为你可以使用自定义条件。例如,在编译任务之后添加一个创建变量的任务,然后使用该变量的值作为发布测试结果的条件,例如and(succeeded(), eq(variables['variableName'], 'variableValue'))

您可以指定任务或作业的运行条件。更详细的信息,您可以参考这里