我们已经发现,Azure Devops 尚不支持在多存储库结构上的两个构建之间获取更改或工作项。不过,有一个feature-request。
为了解决这个问题,我检查了图形界面如何检索信息并注意到有一些未记录的函数称为HierarchyQuery。经过一些试验和错误后,我让该功能在我的应用程序中工作。不过,我们需要在此处提供一些信息。
首先当然是一些身份验证 - 在我的示例中,我使用私有访问令牌。这与验证“普通”API 相同。这里的第二点是我们应该在 POST 请求中使用的一些数据。这主要包含我们想要更改的 repo ("artifactAlias":"Repo2") 以及我们想要检查的 build-id ("currentRunId":3)。由于我们有多个 repos,我们需要循环它们,我在这里省略了,你明白了吧?
最后,我们需要解析响应以获取工作项。从那里我们可以再次使用普通 API 来查询关联的项目。
但请注意,这完全没有文档记录,也没有公共 API。
string workItemId;
var json = "{\"contributionIds\":[\"ms.vss-traceability-web.traceability-workitems-data-provider\"],\"dataProviderContext\":{\"properties\":{\"artifactAlias\":\"Repo2\",\"currentRunId\":3,\"useSnapshot\":true,\"sourcePage\":{\"url\":\"https://dev.azure.com/myorganization/PipelineTest/_traceability/runview/workitems?currentRunId=3\",\"routeId\":\"ms.vss-traceability-web.traceability-run-workitems-hub-default-route\",\"routeValues\":{\"project\":\"PipelineTest\",\"controller\":\"ContributedPage\",\"action\":\"Execute\",\"serviceHost\":\"MyServiceHost\"}}}}}";
var content = new StringContent(json, Encoding.UTF8, "application/json");
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Accept.ParseAdd("application/json;api-version=5.0-preview.1;excludeUrls=true;enumsAsNumbers=true;msDateFormat=true;noArrayWrap=true");
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic",
Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(string.Format("{0}:{1}", "", myPAT))));
using (HttpResponseMessage response = client.PostAsync("https://dev.azure.com/myorganization/_apis/Contribution/HierarchyQuery", content).Result)
{
response.EnsureSuccessStatusCode();
string responseBody = response.Content.ReadAsStringAsync().Result;
dynamic r = JsonConvert.DeserializeObject(responseBody);
workItemId = (string)r["dataProviders"]["ms.vss-traceability-web.traceability-workitems-data-provider"]["data"][0]["id"];
}
}
var connection = new VssConnection(clientBaseAddress, new VssBasicCredential(string.Empty, pat));
var wiclient = connection.GetClient<WorkItemTrackingHttpClient>();
var workItem = wiclient.GetWorkItemAsync(projectName, Int32.Parse(workItemId)).Result;