调用Azure DevOps API获取流水线提交ID及PowerShell语法求助
解决Azure DevOps API获取最新成功流水线提交ID的问题
问题描述
我想获取Azure DevOps中流水线最后一次成功运行的提交ID,尝试调用API时遇到两个问题:
- 不知道
/latestAPI端点里的definition参数该填什么 - 成功调用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
相关产品推荐
相关产品推荐

