如何将模板中关联的User Stories克隆至新work item?求解决方案
问题
我有一个关联了若干User Stories的Feature模板(比如新员工入职场景模板),但用这个模板创建新Feature时,模板里关联的User Stories不会同步导入到新的工作项中。每次创建新Feature都得手动创建User Stories,企业有大量新员工时操作特别繁琐,有没有可行的解决办法?
附截图:
- 带关联User Stories的Feature模板:

- 使用模板创建的新Feature(未复制User Stories):

可行解决办法
1. 直接克隆已有模板Feature
从截图界面来看你用的应该是Azure DevOps,直接克隆带关联User Stories的原始模板Feature比用模板创建更靠谱:
- 打开模板Feature,点击右上角的
...菜单选择克隆 - 在克隆弹窗里勾选包括链接的工作项,这样关联的User Stories会被一并克隆
- 最后修改新Feature的名称、描述等信息即可完成创建
2. 安装第三方模板扩展
去Azure DevOps Marketplace找支持关联子项的模板扩展,比如Work Item Templates Plus或Templator,这类扩展能创建包含关联User Stories的完整模板,创建新工作项时会自动同步所有关联内容。
3. 写脚本批量自动化
如果需要批量处理大量新员工的情况,用Azure DevOps REST API写个脚本就能搞定:
- 先获取模板Feature的关联User Stories列表
- 创建新Feature后,循环克隆每个User Story并关联到新Feature上
下面是核心逻辑的PowerShell示例:
# 配置Azure DevOps信息 $orgUrl = "https://dev.azure.com/你的组织名" $projectName = "你的项目名" $pat = "你的个人访问令牌" # 获取模板Feature的关联User Stories $templateFeatureId = 1234 # 替换成模板Feature的ID $relatedStories = Invoke-RestMethod -Uri "$orgUrl/$projectName/_apis/wit/workitems/$templateFeatureId/relations?api-version=7.1-preview.2" ` -Headers @{Authorization = "Basic $([Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$pat")))"} # 创建新Feature $newFeatureBody = '[{"op": "add", "path": "/fields/System.Title", "value": "新员工入职-张三"}]' $newFeature = Invoke-RestMethod -Uri "$orgUrl/$projectName/_apis/wit/workitems/$`Feature?api-version=7.1-preview.3" ` -Method Post -Headers @{Authorization = "Basic $([Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$pat")))"; "Content-Type" = "application/json-patch+json"} ` -Body $newFeatureBody # 克隆并关联每个User Story foreach ($relation in $relatedStories.value) { if ($relation.rel -eq "System.LinkTypes.Hierarchy-Reverse") { $storyId = $relation.url.Split("/")[-1] # 获取原User Story标题 $originalStory = Invoke-RestMethod -Uri $relation.url -Headers @{Authorization = "Basic $([Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$pat")))"} $storyTitle = $originalStory.fields.'System.Title' # 克隆User Story $clonedStoryBody = "[{`"op`": `"add`", `"path`": `"/fields/System.Title`", `"value`": `"$storyTitle`"}]" $clonedStory = Invoke-RestMethod -Uri "$orgUrl/$projectName/_apis/wit/workitems/$`User Story?api-version=7.1-preview.3" ` -Method Post -Headers @{Authorization = "Basic $([Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$pat")))"; "Content-Type" = "application/json-patch+json"} ` -Body $clonedStoryBody # 关联到新Feature $linkBody = "[{`"op`": `"add`", `"path`": `"/relations/-`", `"value`": {`"rel`": `"System.LinkTypes.Hierarchy-Forward`", `"url`": `"$($clonedStory.url)`"}}]" Invoke-RestMethod -Uri "$orgUrl/$projectName/_apis/wit/workitems/$($newFeature.id)?api-version=7.1-preview.2" ` -Method Patch -Headers @{Authorization = "Basic $([Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$pat")))"; "Content-Type" = "application/json-patch+json"} ` -Body $linkBody } }
4. 用Pipeline实现全自动化
可以搭建一个Azure DevOps Pipeline,触发条件设为提交新员工信息表单(比如通过Power Apps或表单工具),让Pipeline自动执行脚本创建带关联User Stories的Feature,彻底省去手动操作。
内容的提问来源于stack exchange,提问作者Cataster
相关产品推荐
相关产品推荐

