首页 > 解决方案 > 使用客户端库将多个任务添加到 DevOps 中的用户故事

问题描述

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

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

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

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-devopsazure-web-app-service

解决方案


结果比我想象的要容易

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

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

推荐阅读