【问题标题】:Add multiple Tasks to a User Story in DevOps using Client libraries使用客户端库将多个任务添加到 DevOps 中的用户故事
【发布时间】:2021-08-09 15:00:45
【问题描述】:

我正在尝试将多个任务添加到 Azure Dev Ops 中的新用户故事,并且正在努力将新创建的任务链接到用户故事。

我可以毫无问题地创建用户故事,并认为我可以使用相同的方法来创建任务,然后通过父字段进行链接,但这似乎不起作用。

这是我用来创建任务的代码:

var useCase = _traceContext.UseCases.Include(u => u.DeconstructionStage).FirstOrDefault(u => u.ObjID == useCaseObjID);
        List<UseCaseADO> tasks;
        if (useCase.DeconstructionStage.StageOrder < 4)
        {
            tasks = new List<UseCaseADO> 
            {
                { new UseCaseADO { StackRank = "1", WorkItemType = "Task", Title1="Create Test Script", Description="See Create Test Script in the Working Practices document", AcceptanceCriteria="", AssignedTo="", State="New", Tags="Discover(Test)", Priority = "1" } },
                { new UseCaseADO { StackRank = "2", WorkItemType = "Task", Title1="Create Discovery Trace", Description="See Create Discovery Trace in the Working Practices document", AcceptanceCriteria="", AssignedTo="", State="New", Tags="Discover(Test)", Priority = "1" } },
                { new UseCaseADO { StackRank = "3", WorkItemType = "Task", Title1="Review Use Case (Dev)", Description="See Review Use Case (Dev) in the Working Practices document", AcceptanceCriteria="", AssignedTo="", State="New", Tags="Discover(Dev)", Priority = "1" } },
                { new UseCaseADO { StackRank = "4", WorkItemType = "Task", Title1="Review Use Case (Test)", Description="See Review Use Case (Test) in the Working Practices document", AcceptanceCriteria="", AssignedTo="", State="New", Tags="Discover(Test)", Priority = "1" } },
                { new UseCaseADO { StackRank = "5", WorkItemType = "Task", Title1="Create and Annotate Define Traces", Description="See Create and Annotate Define Traces in the Working Practices document", AcceptanceCriteria="", AssignedTo="", State="New", Tags="Define(Dev)", Priority = "1" } }
            };

        }
        else
        {
            tasks = new List<UseCaseADO> 
            {
                { new UseCaseADO { ID = "", StackRank = "6", WorkItemType = "Task", Title1="Refactor Code", AssignedTo="", Description="", AcceptanceCriteria="", State="New", Tags="Deconstruct(Dev)", Priority = "1" } },
                { new UseCaseADO { ID = "", StackRank = "7", WorkItemType = "Task", Title1="Deconstruction Test", Description="", AcceptanceCriteria="", AssignedTo="", State="New", Tags="Deconstruct(Test)", Priority = "1" } },
                { new UseCaseADO { ID = "", StackRank = "8", WorkItemType = "Task", Title1="Decommision Code", Description="", AcceptanceCriteria="", AssignedTo="", State="New", Tags="Decommision(Dev)", Priority = "1" } },
                { new UseCaseADO { ID = "", StackRank = "9", WorkItemType = "Task", Title1="Decommision Test", Description="", AcceptanceCriteria="", AssignedTo="", State="New", Tags="Decommision(Test)", Priority = "1" } },
                { new UseCaseADO { ID = "", StackRank = "10", WorkItemType = "Task", Title1="Decommision Data", Description="", AcceptanceCriteria="", AssignedTo="", State="New", Tags="Decommision(Dev)", Priority = "1" } },
                { new UseCaseADO { ID = "", StackRank = "11", WorkItemType = "Task", Title1="Decommision Test", Description="", AcceptanceCriteria="", AssignedTo="", State="New", Tags="Decommision(Test)", Priority = "1" } }
            };

        }

        VssBasicCredential credentials = new VssBasicCredential("", _personalAccessToken);
        VssConnection connection = new VssConnection(new Uri(_uri), credentials);
        WorkItemTrackingHttpClient workItemTrackingHttpClient = connection.GetClient<WorkItemTrackingHttpClient>();

        try
        {
            foreach (var task in tasks)
            {
                JsonPatchDocument patchDocument = GetTaskPatchDoc(userStoryID, task);
                WorkItem result = workItemTrackingHttpClient.CreateWorkItemAsync(patchDocument, _project, "Task").Result;
            }
        }
        catch (AggregateException ex)
        {
            _logger.Error("Error creating user story: {0}", ex.InnerException.Message);
            return false;
        }

GetTaskPatchDoc 看起来像这样

private JsonPatchDocument GetTaskPatchDoc(int userStoryID, UseCaseADO task)
    {
        JsonPatchDocument patchDocument = new JsonPatchDocument();

        Dictionary<string, string> values = new Dictionary<string, string>()
        {
            { "/fields/System.Title", task.Title1 },
            { "/fields/System.Description", task.Description},
            { "/fields/System.State", task.State },
            { "/fields/System.Tags", task.Tags },
            { "/fields/Microsoft.VSTS.Common.StackRank", task.StackRank},
            { "/fields/Microsoft.VSTS.Common.Priority", task.Priority },
            { "/fields/System.Parent", userStoryID.ToString() }
        };

        foreach (KeyValuePair<string, string> value in values)
        {
            patchDocument.Add(
                new JsonPatchOperation()
                {
                    Operation = Operation.Add,
                    Path = value.Key,
                    Value = value.Value
                }
           );
        }

        return patchDocument;
    }

任务已正确创建,但我缺少用户故事和任务之间的链接。

有谁知道如何通过客户端库做到这一点?我不想将代码切换到 REST API,因为其余代码运行良好。

提前致谢。

【问题讨论】:

    标签: c# azure-devops azure-web-app-service


    【解决方案1】:

    结果比我想象的要容易

    为用户故事构建 PatchDoc 时的每个任务

     patchDocument.Add(
                    new JsonPatchOperation()
                    {
                        Operation = Operation.Add,
                        Path = "/relations/-",
                        Value = new
                        {
                            rel = "System.LinkTypes.Hierarchy-Forward",
                            url = task.Url,
                            attributes = new { comment = "" }
                        }
                    }
                );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-22
      • 2012-05-10
      • 1970-01-01
      相关资源
      最近更新 更多