c# - 使用客户端库将多个任务添加到 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,因为其余代码运行良好。
提前致谢。
解决方案
结果比我想象的要容易
为用户故事构建 PatchDoc 时的每个任务
patchDocument.Add(
new JsonPatchOperation()
{
Operation = Operation.Add,
Path = "/relations/-",
Value = new
{
rel = "System.LinkTypes.Hierarchy-Forward",
url = task.Url,
attributes = new { comment = "" }
}
}
);
推荐阅读
- r - R中的Stata选项卡命令的等效项
- arcore - 对于 ARCore TramsformableNode,Pinch getture 在第一时间不起作用
- java - Switch 声明(价格以 5 美分递增)
- android - 当 Admob 横幅位于软键盘后面且不可见时,谷歌是否付费?
- css - background-size before IE9
- xamarin.forms - 在滚动回视图之前,Listview 不会渲染 viewcell
- firebase - Firebase 控制台未在任何浏览器中加载
- python - 为什么我的列在 django_tables2 中不包含它们各自属性的类名?
- svg - Webpack QuillJS 输出 SVG 路径而不是内联它
- reactjs - 是否有任何类似于 EXPO 的应用程序,可用于在 ios 设备上运行 javascript 应用程序,而无需发布到应用商店?