azure - 在 Azure Pipelines 中继续出错(但仍报告为错误)
问题描述
我有一个由 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
领域的确切内容的文档有点差,但具体来说,我建议您参考条件、表达式和表达式#Job status check functions。
推荐阅读
- php - 如果记录不存在,php 不返回消息:“记录不存在”
- flutter - 如何在 Flutter 中获取系统时间格式(24 或 12 AM/PM)?
- amazon-web-services - 如何从充当客户端的 Lambda 中检索 EC2(服务器)的 IP 地址?
- angular - Angular,行为主体,在一个组件中更改数据,在另一个组件中进行更改
- jquery - 如何在 $(document).ready(function(e){ 中获取文件输入变量
- .htaccess - 将所有 url 索引重写为子文件夹
- android - Opencv在图像崩溃时写入文本长时间没有找到实现org.opencv.core.Mat.n_Mat(
- android - 应用程序运行时单例丢失状态
- php - 通过functions.php将Wordpress用户的默认显示名称设置为'firstname + lastname'
- java - 在设置 @Trace(dispatcher=true) 注释之前设置自定义参数