从 Azure Devops WebApi 中的工作项检索拉取请求

Retrieve Pull Request from Work Item in Azure Devops WebApi

我想使用 Azure DevOps WebAPI 以编程方式检索与 Azure DevOps 中的工作项关联的所有拉取请求的信息。 我已经弄清楚如何检索

的实例
Microsoft.TeamFoundation.WorkItemTracking.WebApi.Model.WorkItem

对于我的工作项目。

要查找与其相关的拉取请求,我可以遍历 Relations 字段并找到 Url 包含 PullRequestId 的关系。在该字符串的末尾,我可以找到要与 GetPullRequestAsync 一起使用的 Pull Request id。

URL 可能如下所示:

vstfs:///Git/PullRequestId/2139bb34-57e3-4d7d-a6e1-1c0542a45e29%2F8a2b707f-ca7a-418d-8462-2bf076a54aad%2F39723

所以我的代码应该是这样的:

foreach ( WorkItemRelation wir in wi.Relations)
{
     if ( wir.Url.Contains("PullRequestId"))
     {
          var pr = build.GetPullRequestAsync("<MyProject>", "Providername", "39723", "repository id").Result;
          // Do somethin with pr object
     }
}

我的问题如下

  1. 解析 URL 以检索 Pull Request id 似乎不是执行此操作的好方法。我不能从某些字段中获取 ID 吗?
  2. GetPullRequestAsync 需要提供者名称和存储库 ID。 但是如果不能从实例中检索到该信息 Microsoft.TeamFoundation.WorkItemTracking.WebApi.Models.WorkItemRelation.
  3. 是否有另一种更简单的方法来完成我想做的事情?

与其依赖 PullRequestId,我建议您使用属性。在URL你会找到你需要的一切:

var credential = new VssBasicCredential(string.Empty, "PAT");
var connection = new VssConnection(new Uri("https://dev.azure.com/thecodemanual/"), credential);
var witClient = connection.GetClient<WorkItemTrackingHttpClient>();

var build = connection.GetClient<BuildHttpClient>();

var repoClient = connection.GetClient<GitHttpClient>();

var workItem = witClient.GetWorkItemAsync(1, expand: Microsoft.TeamFoundation.WorkItemTracking.WebApi.Models.WorkItemExpand.Relations).Result;

foreach (var relation in workItem.Relations)
{
    if((string)relation.Attributes["name"] == "Pull Request")
    {
        Console.WriteLine(relation.Url);

        var segment = relation.Url.Split("/").Last();

        var ids = segment.Split("%2F");

        var repo = repoClient.GetRepositoryAsync(ids[1]).Result;

        Console.WriteLine(repo.Name);

        var pr = build.GetPullRequestAsync(ids[0], "TfsGit", ids[2], ids[1]).Result;

        Console.WriteLine(pr.Title);
        // Do somethin with pr object
    }

}

据我所知,没有其他更好的方法来实现这一目标。目前已知的方法是从 url.

中检索 pull request id

从响应中您可以检索与 "name": "Pull Request" 的关系。然后你可以将url字符串拆分为%2F,pull request id是最后一部分。

关于第二个问题,您可以使用此 Get Pull Request By Id rest api 获取拉取请求的详细信息。只需要在请求中提供 pull request id。

GET https://dev.azure.com/{organization}/{project}/_apis/git/pullrequests/{pullRequestId}?api-version=5.1