如何用C#向Azure Pipelines发起REST调用查询构建ID及状态
C#调用Azure DevOps Pipeline REST接口获取构建状态实现方案
前置准备
- 提前生成Azure DevOps个人访问令牌(PAT),授予对应项目的生成(Build)读取权限,无有效令牌调用接口会返回401未授权。
- 从你持有的Pipeline URL中提取基础参数:组织名、项目名、Pipeline定义ID,若URL本身带
buildId参数可直接解析复用,无需额外拉取构建列表。
常规Pipeline定义页URL格式:https://dev.azure.com/{组织名}/{项目名}/_build?definitionId={定义ID}
单次构建详情页URL格式:https://dev.azure.com/{组织名}/{项目名}/_build/results?buildId={构建ID}&view=results
鉴权配置
Azure DevOps REST API采用Basic认证,PAT作为密码,用户名留空即可,C#中HttpClient配置代码如下:
using System.Net.Http.Headers; using System.Text.Json.Nodes; // 替换为你自己的PAT string pat = "你的个人访问令牌"; var patEncoded = Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes($":{pat}")); using var httpClient = new HttpClient { BaseAddress = new Uri("https://dev.azure.com/") }; httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", patEncoded);
获取目标构建ID
如果URL中没有直接带buildId,调用构建列表接口拉取指定Pipeline下最新的构建记录即可拿到ID:
// 替换为从URL解析出的实际参数 string org = "你的组织名"; string project = "你的项目名"; int definitionId = 123; // 从URL的definitionId参数提取 // 拉取指定Pipeline最新1条构建记录 string getBuildListUrl = $"{org}/{project}/_apis/build/builds?definitions={definitionId}&$top=1&api-version=7.1"; var listResponse = JsonNode.Parse(await httpClient.GetStringAsync(getBuildListUrl)); int targetBuildId = listResponse["value"][0]["id"].GetValue<int>();
如果你需要查历史某一次构建,可在接口上增加时间筛选、分支筛选参数,匹配你需要的构建记录即可。
查询构建/作业执行结果
拿到构建ID后,调用构建详情接口即可获取执行状态:
string getBuildDetailUrl = $"{org}/{project}/_apis/build/builds/{targetBuildId}?api-version=7.1"; var buildDetail = JsonNode.Parse(await httpClient.GetStringAsync(getBuildDetailUrl)); string status = buildDetail["status"].GetValue<string>(); string result = buildDetail["result"]?.GetValue<string>(); if (!status.Equals("completed", StringComparison.OrdinalIgnoreCase)) { Console.WriteLine($"构建未执行完成,当前状态:{status}"); return; } bool isBuildSuccess = result.Equals("succeeded", StringComparison.OrdinalIgnoreCase); Console.WriteLine(isBuildSuccess ? "构建执行成功" : "构建执行失败");
如果需要查询Pipeline下单个Job的执行结果,调用构建时间线接口匹配Job ID即可:
// 替换为从URL解析出的jobId string targetJobId = "你的目标作业ID"; string getTimelineUrl = $"{org}/{project}/_apis/build/builds/{targetBuildId}/timeline?api-version=7.1"; var timeline = JsonNode.Parse(await httpClient.GetStringAsync(getTimelineUrl)); var targetJob = timeline["records"].AsArray() .First(r => r["id"].GetValue<string>().Equals(targetJobId, StringComparison.OrdinalIgnoreCase)); bool isJobSuccess = targetJob["result"].GetValue<string>().Equals("succeeded", StringComparison.OrdinalIgnoreCase);
注意事项
- 接口路径中的
api-version=7.1是通用稳定版本,如果你使用的是本地部署的Azure DevOps Server,可替换为对应版本支持的API版本号。 - 若你操作的是发布流水线(Release Pipeline),仅需将接口路径中的
build替换为release,鉴权逻辑完全一致。 - 不建议硬编码PAT到代码中,生产环境请用环境变量、密钥保管库等安全方式存储密钥。
内容的提问来源于stack exchange,提问作者user18093810
相关产品推荐
相关产品推荐

