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

如何在Azure Pipeline运行中自动定位失败的作业及任务,并通过Microsoft Teams发送故障通知?

解决方案:自动获取Azure Pipeline失败的Job/Task信息并发送Teams通知

没问题,完全可以实现这个需求,而且不用手动维护那些繁琐的自定义变量!下面给你一套适配多Pipeline场景的可行方案:

一、先配置一个“失败专属”的通知Job

首先在你的Pipeline YAML里加一个专门用来发失败通知的Job,让它只有在前面的Job失败时才触发:

jobs:
- job: 你的业务Job名称
  # 这里放你原本的Job和Task内容
  steps:
  - script: echo "正常执行的业务任务"

- job: SendFailureAlert
  dependsOn: 你的业务Job名称
  condition: failed() # 只有前面的Job失败时才运行这个Job
  steps:
  - task: PowerShell@2
    displayName: '抓取失败详情并发送Teams通知'
    inputs:
      targetType: 'inline'
      script: |
        # 下面写核心的脚本内容

二、用REST API自动抓取失败的Job/Task

在这个PowerShell任务里,我们可以调用Azure DevOps的REST API,动态获取当前Pipeline运行的所有失败任务信息——全程依赖预定义的系统变量,不用手动加任何自定义变量,完美适配你20多个Pipeline的场景。

完整脚本示例

# 1. 从系统变量里获取必要的信息,不用手动改
$orgUrl = "$(System.TeamFoundationCollectionUri)"
$projectName = "$(System.TeamProject)"
$runId = "$(System.RunId)"
$apiVersion = "7.1-preview.1"

# 2. 获取当前Pipeline运行的所有Job
$jobsListUrl = "$orgUrl$projectName/_apis/pipelines/runs/$runId/jobs?api-version=$apiVersion"
$jobsResponse = Invoke-RestMethod -Uri $jobsListUrl -Headers @{Authorization = "Bearer $(System.AccessToken)"} -Method Get

# 3. 遍历每个Job,找出里面失败的Task
$failedDetails = @()
foreach ($job in $jobsResponse.value) {
    # 获取当前Job下的所有Task
    $tasksListUrl = "$orgUrl$projectName/_apis/pipelines/runs/$runId/jobs/$($job.id)/tasks?api-version=$apiVersion"
    $tasksResponse = Invoke-RestMethod -Uri $tasksListUrl -Headers @{Authorization = "Bearer $(System.AccessToken)"} -Method Get
    
    # 筛选出状态为失败的Task
    foreach ($task in $tasksResponse.value) {
        if ($task.state -eq 'failed') {
            $failedDetails += "Job: **$($job.name)** | 失败Task: **$($task.name)**"
        }
    }
}

# 4. 构建Teams通知的内容
$teamsMsg = @"
🚨 **Pipeline运行失败告警**
Pipeline名称: $(Build.DefinitionName)
运行编号: $(Build.BuildNumber)
失败位置详情:
- $($failedDetails -join "`n- ")
查看完整日志: [点击跳转]($(Build.BuildUri))
"@

# 5. 发送到Teams频道(替换成你已配置的Webhook URL)
$teamsWebhook = "你的Teams频道Webhook地址"
Invoke-RestMethod -Uri $teamsWebhook -Method Post -Body (ConvertTo-Json @{text = $teamsMsg}) -ContentType "application/json"

三、关键配置注意事项

  • 权限开启:一定要在Pipeline的Agent Job设置里,勾选“允许脚本访问OAuth令牌”(在“附加选项”里),这样$(System.AccessToken)才能正常调用REST API。
  • API版本兼容:示例用的是预览版API7.1-preview.1,如果你的Azure DevOps版本稳定,也可以换成7.0这样的正式版。
  • 批量复用:这个脚本可以直接复制到所有Pipeline里,不用做任何自定义变量修改,所有信息都是从系统变量动态获取的,完全适配你不断增长的Pipeline数量。

简化版备选方案

如果不需要太细致的Task列表,也可以直接用几个预定义变量快速定位:

  • $(Build.DefinitionName):当前Pipeline名称
  • $(System.JobName):失败的Job名称(但这个变量只能在失败的Job内部获取,所以单独的通知Job还是推荐用REST API方案)
  • $(Build.BuildUri):直接跳转到失败的运行详情页

内容的提问来源于stack exchange,提问作者Moshe Bar-Nachoom

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 20:52:43