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

调用Azure DevOps API获取流水线提交ID及PowerShell语法求助

解决Azure DevOps API获取最新成功流水线提交ID的问题

问题描述

我想获取Azure DevOps中流水线最后一次成功运行的提交ID,尝试调用API时遇到两个问题:

  1. 不知道/latest API端点里的definition参数该填什么
  2. 成功调用API后,无法在PowerShell脚本中正确提取响应里的sourceVersion(提交ID)属性

尝试的脚本及错误响应:
最初调用构建列表API的脚本:

- task: PowerShell@2
    inputs:
      targetType: 'inline'
      script: |
        $uri="https://dev.azure.com/mycompany/myproject/_apis/build/builds?resultFilter=succeeded&api-version=6.1"
        $builds=(Invoke-RestMethod -Uri $uri -Method GET -Headers @{ Authorization = "Bearer $(System.AccessToken)" })
        echo "Response: $builds"
        echo "Builds: $builds.Build[0].definition.name"

得到的响应:

========================== Starting Command Output ===========================
/usr/bin/pwsh -NoLogo -NoProfile -NonInteractive -Command . '/home/vsts/work/_temp/2ec4dfbd-d2d6-42e4-bd9e-9dfa3bad28f0.ps1'
Response: @{count=1000; value=System.Object[]}
Builds: @{count=1000; value=System.Object[]}.Build[0].definition.name
Finishing: PowerShell

后续能拿到API响应,但无法提取sourceVersion:

$response=(Invoke-RestMethod -Uri $uri -Method GET -Headers @{ Authorization = "Bearer $(System.AccessToken)" })
echo "Response: $response"
echo "Source version: $response.value"

响应中可见sourceVersion=fb29c721eaaaacf47f35ff900fe7086084cd321356,但无法正确提取。

解决方案

1. definition参数的取值

definition对应的是流水线定义ID,你可以在Azure DevOps流水线页面的URL中找到:比如流水线页面URL为https://dev.azure.com/组织名/项目名/_build?definitionId=123,这里的123就是该流水线的定义ID。

2. 正确提取提交ID的PowerShell脚本

方法一:调用构建列表API获取最新成功记录

添加top=1参数只返回最新的1条成功构建,减少数据传输,然后直接访问对象属性:

- task: PowerShell@2
  inputs:
    targetType: 'inline'
    script: |
      # 如需指定特定流水线,添加&definitionId=你的流水线ID
      $uri="https://dev.azure.com/mycompany/myproject/_apis/build/builds?resultFilter=succeeded&top=1&api-version=6.1"
      $response = Invoke-RestMethod -Uri $uri -Method GET -Headers @{ Authorization = "Bearer $(System.AccessToken)" }
      # 取数组第一个元素(最新的成功构建)
      $latestBuild = $response.value[0]
      $commitId = $latestBuild.sourceVersion
      echo "最新成功流水线的提交ID:$commitId"
      # 可选:将提交ID设置为流水线变量,供后续任务使用
      echo "##vso[task.setvariable variable=LatestSuccessfulCommitId;]$commitId"

方法二:直接调用/latest API端点

拿到流水线定义ID后,用这个端点直接获取最新成功构建的详情,更简洁:

- task: PowerShell@2
  inputs:
    targetType: 'inline'
    script: |
      $definitionId = "你的流水线定义ID"
      $uri="https://dev.azure.com/mycompany/myproject/_apis/build/latest/$definitionId?api-version=6.0-preview.1"
      $latestBuild = Invoke-RestMethod -Uri $uri -Method GET -Headers @{ Authorization = "Bearer $(System.AccessToken)" }
      $commitId = $latestBuild.sourceVersion
      echo "最新成功流水线的提交ID:$commitId"
      # 可选:设置流水线变量
      echo "##vso[task.setvariable variable=LatestSuccessfulCommitId;]$commitId"

关键说明

  • Invoke-RestMethod返回的是PSCustomObject,构建数据存储在value数组中(构建列表API),直接通过.访问属性即可
  • top=1参数确保只返回最新的一条记录,提升效率
  • 若要指定特定流水线,在API URL中添加&definitionId=你的流水线ID参数

内容的提问来源于stack exchange,提问作者RobC

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 02:20:53