Azure DevOps Pipeline矩阵任务异常后恢复任务未触发问题排查
Azure DevOps Pipeline 错误控制任务未触发问题排查
问题说明
配置了包含三个任务的Azure DevOps Pipeline:矩阵任务GetFiles、清理任务Cleanup、恢复任务ErrorControl。需求为:当GetFiles或Cleanup任务失败或被取消时,ErrorControl任务必须运行。但出现异常场景:GetFiles的一个矩阵子任务成功,另一个因代理重启(代理连接丢失)异常,Cleanup任务因always()条件正常执行,但ErrorControl任务未触发——因为当前整体状态既不满足failed()也不满足canceled()。
当前配置代码
- job: GetFiles strategy: matrix: AF0: MacId: 0 AF1: MacId: 1 steps: - job: Cleanup dependsOn: GetFiles condition: always() steps: - powershell: | displayName: "Dismount" errorActionPreference: continue failOnStderr: false ignoreLASTEXITCODE: false - job: ErrorControl dependsOn: - GetFiles - Cleanup condition: or(failed(), canceled()) steps:
问题根因
- 矩阵任务状态特性:当
GetFiles的矩阵子任务部分成功、部分失败时,该任务的整体状态为partiallySucceeded(部分成功),而非failed或canceled。 - 条件判断逻辑缺陷:当前
ErrorControl的condition仅判断了failed()和canceled(),未覆盖partiallySucceeded的场景;同时,failed()是判断所有依赖任务的组合状态——由于Cleanup任务成功执行,组合状态不会触发failed()。
修正方案
调整ErrorControl的条件判断,明确检查GetFiles是否处于失败、取消或部分成功状态,同时检查Cleanup是否失败或取消。修正后的条件如下:
condition: or(failed('GetFiles'), canceled('GetFiles'), partiallySucceeded('GetFiles'), failed('Cleanup'), canceled('Cleanup'))
完整修正后代码
- job: GetFiles strategy: matrix: AF0: MacId: 0 AF1: MacId: 1 steps: - job: Cleanup dependsOn: GetFiles condition: always() steps: - powershell: | displayName: "Dismount" errorActionPreference: continue failOnStderr: false ignoreLASTEXITCODE: false - job: ErrorControl dependsOn: - GetFiles - Cleanup condition: or(failed('GetFiles'), canceled('GetFiles'), partiallySucceeded('GetFiles'), failed('Cleanup'), canceled('Cleanup')) steps:
逻辑说明
failed('GetFiles'):捕获GetFiles任务整体失败的场景canceled('GetFiles'):捕获GetFiles任务被取消的场景partiallySucceeded('GetFiles'):捕获GetFiles矩阵子任务部分失败的场景failed('Cleanup')/canceled('Cleanup'):捕获清理任务自身失败或被取消的场景
内容的提问来源于stack exchange,提问作者B.McKee
相关产品推荐
相关产品推荐

