【问题标题】:Associate Work Items to a Pull Request Programmatically以编程方式将工作项与拉取请求相关联
【发布时间】:2017-01-14 03:11:09
【问题描述】:

我可以获得 (https://www.visualstudio.com/en-us/docs/integrate/api/git/pull-requests#get-a-pull-request) 拉取请求、管理审阅者并完成它。分支有一个需要工作项的策略,但由于拉取请求不会自动添加与基础提交相关联的工作项,因此它失败了。

针对带有错误参数的拉取请求戳 PATCH 会导致

"您只能更新审稿人、描述、标题、合并状态、 和状态”

我可以使用拉取请求 url + /workitems 获取工作项列表,但集合不支持 POST、PUT 和 PATCH。

我没有看到将工作项与拉取请求相关联的方法?

【问题讨论】:

  • 您是否成功地将拉取请求链接到工作项或投票给该用户的声音?
  • 我对这个问题进行了投票,因为目前似乎没有程序化方式。

标签: git azure-devops pull-request


【解决方案1】:

您可以通过更新工作项链接将工作项与拉取请求相关联,就像 starain 提到的那样。

不确定您使用的是哪种代码语言,我添加了一个 C# 代码示例供您参考:

using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.SourceControl.WebApi;
using Microsoft.TeamFoundation.WorkItemTracking.WebApi;
using Microsoft.VisualStudio.Services.WebApi.Patch.Json;
using Microsoft.TeamFoundation.WorkItemTracking.WebApi.Models;

namespace PRWIl
{
    class Program
    {
        static void Main(string[] args)
        {
            string tfsurl = "https://xxx.visualstudio.com/";
            TfsTeamProjectCollection ttpc = new TfsTeamProjectCollection(new Uri(tfsurl));
            GitHttpClient ghc = ttpc.GetClient<GitHttpClient>();
            string project = "ProjectName";
            string repoid = "repositoryid";
            int pullrequestid = 1;
            int workitemid = 1;
            GitPullRequest gpr = ghc.GetPullRequestAsync(project,repoid,pullrequestid).Result;

            WorkItemTrackingHttpClient withc = ttpc.GetClient<WorkItemTrackingHttpClient>();

            JsonPatchDocument json = new JsonPatchDocument();

            string pullrequesturl = "vstfs:///Git/PullRequestId/" + gpr.Repository.ProjectReference.Id + "%2F" + gpr.Repository.Id + "%2F" + gpr.PullRequestId;
            json.Add(new JsonPatchOperation
            {
                Operation = Microsoft.VisualStudio.Services.WebApi.Patch.Operation.Add,
                Path = "/relations/-",
                Value = new WorkItemRelation() {Rel = "ArtifactLink", Url = pullrequesturl }
            });
            WorkItem result = withc.UpdateWorkItemAsync(json,workitemid).Result;
        }
    }
}

【讨论】:

    【解决方案2】:

    不支持通过 REST API 或客户端 SDK API 将工作项关联到拉取请求。

    你可以投票给这个用户的声音 (https://visualstudio.uservoice.com/forums/330519-team-services/suggestions/15954904-rest-api-create-or-update-pull-request-with-work-i)

    解决方法是您可以将拉取请求链接到工作项。 https://www.visualstudio.com/en-us/docs/integrate/api/wit/work-items#add-a-link(链接另一个工作项后,可以在响应中找到拉取请求 URL,因此您可以手动将一个工作项链接到拉取请求,然后通过 REST API 将另一个工作项链接到该工作项并检查响应)

    【讨论】:

    • 我需要以编程方式完成此操作,因此无法通过“手动链接”获取 URL。工作项的拉取请求示例链接看起来像 ""vstfs:///Git/PullRequestId/44538c6a-0dbe-4251-bc4b-ca0859243d8e%2f2d89570f-a036-4ccd-a392-f81864f788b4%2f794""来自 REST API 的请求不会填充 self 链接,所以我对使用哪些 ID 来生成要关联的正确链接感到头疼。拉取请求 URL 是否由 GUID 组成,这些 GUID 代表拉取请求创建时的起点和终点?
    • @MontaneHamilton pull request URL 的格式是 vstfs://vstfs:///Git/PullRequestId/[project id]%2F[respository id]%2F[pull request id]。所有这些值都包含在特定拉取请求的响应中(https://[XX].visualstudio.com/[team project]/_apis/git/repositories/[respository name[/pullRequests/[pull request id]?api -version=1.0-preview.1
    • @MontaneHamilton 将拉取请求链接到工作项的示例 JSON。 [ {“op”:“add”,“path”:“/relations/-”,“value”:{“rel”:“ArtifactLink”,“url”:“vstfs:///Git/PullRequestId/b8ee4b6d- d5a8-4e3d-a7f8-f2da9713a830%2Fa4adf519-e040-4ea7-895e-8473d319f229%2F6", "attributes": { "comment": "Making a new link test" } } } ]
    • 是的,我完全了解如何创建链接,但我不确定如何获取拉取请求链接本身。当我通过 API 收到拉取请求时,它似乎不可用。
    • @MontaneHamilton 您需要将它们(团队项目 ID、存储库 ID ...)组合在一起,以根据我说的格式生成新的 URL。
    【解决方案3】:

    现在可以实现了。这是示例代码sn-p:

    List<GitPullRequest> pullRequests = gitClient.GetPullRequestsAsync(
        repoId, GetPullRequestSearchCriteria(devBranch)).Result.Where
        p => p.ClosedDate > masterPullRequest.ClosedDate).ToList();
    
    List<ResourceRef> resourceRef = new List<ResourceRef>();
    
    foreach (GitPullRequest pullRequest in pullRequests)
    {
        resourceRef.AddRange(gitClient.GetPullRequestAsync(
            repoId, pullRequest.PullRequestId, includeWorkItemRefs: true).Result.WorkItemRefs);
    }
    
    GitPullRequest gitPullRequest = new GitPullRequest()
    {
        Title = "Sprint 9",
        TargetRefName = masterBranch,
        SourceRefName = devBranch,
        WorkItemRefs = resourceRef.ToArray()
    };
    
    GitPullRequest g = gitClient.CreatePullRequestAsync(gitPullRequest, repoId).Result;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-17
      • 2023-03-05
      • 2020-04-24
      • 1970-01-01
      • 2018-04-30
      • 2021-06-13
      • 1970-01-01
      • 2015-03-27
      相关资源
      最近更新 更多