You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 23:18:02