[英]Get changes between two builds in Azure DevOps
我嘗試使用此代碼獲取兩個構建之間的更改:
var changes1 = buildClient.GetChangesBetweenBuildsAsync("PipelineTest", 2, 3).Result;
這不返回任何元素。 但是,當我嘗試通過構建 3 的 Web 門戶獲取更改時,我得到了更改:
我也試過build.GetBuildChangesAsync("PipelineTest", 3)
也沒有給我任何結果。
我必須注意到,管道存儲在Repo1
中,而更改是在Repo2
上完成的。
我怎樣才能獲得兩個構建之間的所有更改,而不管它們已提交到存儲庫中?
我正在使用TeamFoundationServer.Client
16.170.0
我們已經發現 Azure Devops 尚不支持在多存儲庫結構上的兩個構建之間獲取更改或工作項。 不過,有一個功能要求。
為了解決這個問題,我檢查了圖形界面如何檢索信息,並注意到有一些未記錄的函數稱為HierarchyQuery
。 經過一些試驗和錯誤后,我讓該功能在我的應用程序中工作。 不過,我們需要在這里提供一些信息。
第一個當然是一些身份驗證 - 在我的示例中,我使用私有訪問令牌。 這與驗證“正常”API 相同。 這里的第二點是我們應該在 POST 請求中使用的一些數據。 這主要包含我們想要更改的 repo ( "artifactAlias":"Repo2"
) 以及我們想要檢查的 build-id ( "currentRunId":3
)。 由於我們有多個 repos,我們需要循環它們,我在這里省略了,你明白了,不是嗎?
最后,我們需要解析響應以獲得 workitemid。 從那里我們可以再次使用普通 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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.