如何在Azure YAML流水线中获取其他任务失败信息并上报Application Insights
需求实现方案
基础配置调整
要实现指定任务失败后触发上报任务,同时获取失败任务信息,可通过Azure DevOps YAML的内置变量、任务状态判断、REST API组合实现,完整可运行的YAML示例如下:
variables: # 开启内置OAuth令牌调用,需同时在代理作业设置中开启「允许脚本访问OAuth令牌」 - name: ADO_AccessToken value: $(System.AccessToken) - name: AppInsights_Key value: 替换为你的Application Insights instrumentation key # 业务任务1 - task: 替换为实际任务类型@版本号 # 比如PowerShell@2、NodeTool@0等 displayName: doSomething1 name: Task1 # 必须设置任务名,后续才能引用该任务的状态变量 continueOnError: true # 任务失败后不终止流水线,确保后续上报任务可执行 inputs: # 此处保留你原任务的所有配置参数 # 业务任务2 - task: 替换为实际任务类型@版本号 displayName: doSomething2 name: Task2 continueOnError: true inputs: # 此处保留你原任务的所有配置参数 # 失败上报任务 - task: PowerShell@2 displayName: log failures in task1 and task2 # 触发条件:仅Task1或Task2任意一个失败时执行 condition: or(eq(variables['Task1.TaskResult'], 'Failed'), eq(variables['Task2.TaskResult'], 'Failed')) inputs: targetType: inline script: | # 1. 收集所有失败的任务信息 $failedTaskList = @() if ("$(Task1.TaskResult)" -eq "Failed") { $failedTaskList += @{ TaskId = "Task1" TaskDisplayName = "doSomething1" } } if ("$(Task2.TaskResult)" -eq "Failed") { $failedTaskList += @{ TaskId = "Task2" TaskDisplayName = "doSomething2" } } # 2. 调用Azure DevOps REST API拉取失败任务的日志 $header = @{ Authorization = "Bearer $(ADO_AccessToken)" } # 获取当前流水线运行的所有日志索引 $logIndexUri = "$(System.CollectionUri)$(System.TeamProject)/_apis/build/builds/$(Build.BuildId)/logs?api-version=7.1-preview.2" $allLogs = Invoke-RestMethod -Uri $logIndexUri -Headers $header -Method Get foreach ($task in $failedTaskList) { # 匹配对应失败任务的日志,可根据实际场景调整匹配规则(比如按任务执行时间、日志关键词匹配) $taskLog = $allLogs.value | Where-Object { $_.createdDate -ge (Get-Date).AddHours(-1) } | Select-Object -Last 1 $logContent = Invoke-RestMethod -Uri $taskLog.url -Headers $header -Method Get # 3. 上报数据到Application Insights $telemetryBody = @{ name = "PipelineTaskFailure" time = (Get-Date).ToUniversalTime().ToString("o") iKey = "$(AppInsights_Key)" data = @{ baseType = "EventData" baseData = @{ name = "PipelineTaskFailure" properties = @{ TaskId = $task.TaskId TaskDisplayName = $task.TaskDisplayName BuildId = $(Build.BuildId) PipelineName = $(Build.DefinitionName) FailureLog = $logContent } } } } Invoke-RestMethod -Uri "https://dc.services.visualstudio.com/v2/track" -Method Post -Body ($telemetryBody | ConvertTo-Json -Depth 10) -ContentType "application/json" }
注意事项
- 必须在流水线代理作业的设置中开启「允许脚本访问OAuth令牌」,否则无法调用Azure DevOps的REST API拉取日志
- 需给当前流水线的构建服务账号分配项目的「生成读取」权限,避免拉取日志时返回403错误
- 日志匹配规则可根据实际场景调整,比如添加任务名关键词匹配、时间范围过滤,确保拿到的是对应失败任务的准确日志
更优替代方案
不需要自行开发上报逻辑,有两种更低维护成本的实现方式:
- 直接使用Azure DevOps与Application Insights的官方内置集成,配置后可自动同步所有流水线任务的失败、运行时长等数据到Application Insights,无需自定义代码
- 使用Azure DevOps市场中的官方上报扩展,只需配置触发规则、Application Insights密钥,即可自动完成失败任务的信息收集和上报,不需要维护REST API调用、日志匹配等逻辑
内容的提问来源于stack exchange,提问作者Ashish Kumar
相关产品推荐
相关产品推荐

