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

时间:2020-06-08 16:07:03

标签: azure-devops azure-devops-rest-api

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

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

关于我的工作项目。

要查找与此相关的拉取请求,我可以遍历“关系”字段并找到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. 还有另一种更轻松的方式来做我想做的事吗?

2 个答案:

答案 0 :(得分:1)

建议您不要使用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
    }

}

答案 1 :(得分:0)

据我所知,没有其他更好的方法可以实现这一目标。当前已知的方法是从网址中检索拉取请求ID。

从响应中,您可以检索与"name": "Pull Request"的关系。然后,您可以使用%2F拆分url字符串,提取请求ID是最后一部分。

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

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