You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将模板中关联的User Stories克隆至新work item?求解决方案

问题

我有一个关联了若干User Stories的Feature模板(比如新员工入职场景模板),但用这个模板创建新Feature时,模板里关联的User Stories不会同步导入到新的工作项中。每次创建新Feature都得手动创建User Stories,企业有大量新员工时操作特别繁琐,有没有可行的解决办法?

附截图:

  • 带关联User Stories的Feature模板:带关联User Stories的Feature模板
  • 使用模板创建的新Feature(未复制User Stories):使用模板创建的新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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 22:55:18