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

如何通过JavaScript获取Azure DevOps中已合并入分支的所有工作项

方案可行性说明

你要实现的需求完全可行,核心逻辑是通过Git提交/标签的范围查询关联的PR,再从PR中提取绑定的工作项,不需要依赖工作项的自定义标签,也不需要用到Azure DevOps的Release模块,完美适配你当前多流水线共用版本号的场景。

实现逻辑

Azure DevOps中只要开发在提交PR时关联了对应工作项(这是绝大多数研发团队的标配规范),你可以通过以下步骤拉取指定分支/标签范围内的所有工作项:

  1. 确定版本对应的提交范围:比如上一个版本的Git标签对应的commit hash,和本次要发布的分支最新commit hash(或本次版本的Git标签对应的commit hash)
  2. 查询提交范围内所有已合并到目标分支的PR
  3. 批量提取所有PR关联的工作项ID,去重后查询工作项详情
  4. 后续生成Markdown、创建Wiki的逻辑可以完全复用你现有代码,迁移成本极低

两种实现路径

路径1:直接调用原生REST API(复用你现有axios的编码风格)

你只需要新增两个查询函数即可:

/**
 * 根据Git标签名获取对应的commit hash
 * @param {String} repoId 代码仓库ID
 * @param {String} tagName Git标签名,如v1.0、v1.1
 * @returns {String} commit hash
 */
async function getCommitByTag(repoId, tagName) {
  try {
    const res = await axios.get(
      `https://dev.azure.com/myTestOrg/myTestProject/_apis/git/repositories/${repoId}/annotatedtags?api-version=7.1-preview.1`,
      { headers: { Authorization: getAuthToken() } }
    )
    return res.data.value.find(tag => tag.name === tagName).taggedObject.objectId
  } catch (e) {
    console.error('获取标签对应commit失败', e.message)
    process.exit(1)
  }
}

/**
 * 查询两个commit之间合并的PR关联的所有工作项
 * @param {String} repoId 代码仓库ID
 * @param {String} fromCommit 起始commit hash
 * @param {String} toCommit 结束commit hash
 * @param {String} targetBranch 目标分支,如refs/heads/main
 * @returns {Array} 工作项基础信息列表,格式和你原有fetchWorkItems返回值一致
 */
async function getWorkItemsBetweenCommits(repoId, fromCommit, toCommit, targetBranch = 'refs/heads/main') {
  const workItemIds = new Set()
  try {
    // 查询范围内已合并的PR
    const prRes = await axios.get(
      `https://dev.azure.com/myTestOrg/myTestProject/_apis/git/repositories/${repoId}/pullRequests?api-version=7.1-preview.1&status=completed&targetRefName=${targetBranch}&minLastMergeCommit=${fromCommit}&maxLastMergeCommit=${toCommit}`,
      { headers: { Authorization: getAuthToken() } }
    )
    // 遍历PR提取关联工作项
    for (const pr of prRes.data.value) {
      const wiRes = await axios.get(
        `https://dev.azure.com/myTestOrg/myTestProject/_apis/git/repositories/${repoId}/pullRequests/${pr.pullRequestId}/workitems?api-version=7.1-preview.1`,
        { headers: { Authorization: getAuthToken() } }
      )
      wiRes.data.value.forEach(wi => workItemIds.add(wi.id))
    }
  } catch (e) {
    console.error('提取PR关联工作项失败', e.message)
    process.exit(1)
  }
  // 转换为你原有逻辑兼容的返回格式
  return Array.from(workItemIds).map(id => ({
    url: `https://dev.azure.com/myTestOrg/myTestProject/_apis/wit/workItems/${id}`
  }))
}

调整你的主流程逻辑即可:

// 示例:获取v1.0到v1.1之间合并到main分支的工作项
const repoId = '你的代码仓库ID'
const fromCommit = await getCommitByTag(repoId, 'v1.0')
const toCommit = await getCommitByTag(repoId, 'v1.1')
const workItems = await getWorkItemsBetweenCommits(repoId, fromCommit, toCommit)
// 后面的逻辑完全复用原有代码
const workItemDetails = await fetchWorkItemDetails(workItems)
const formattedDetails = formatWorkItemDetails(workItemDetails)
const generatedMarkup = generateMarkdown(formattedDetails)
await createWiki(releaseNumber, generatedMarkup)

路径2:使用azure-devops-node-api包

这个是微软官方维护的Azure DevOps Node SDK,封装了所有REST API的鉴权、参数校验、返回值解析逻辑,不需要你手动拼接URL,编码更简洁,完全支持你要实现的功能,你可以根据自己的偏好选择。

适配多流水线/多仓库的说明

如果你的版本对应多个代码仓库的修改,只需要遍历所有关联的代码仓库执行上述查询逻辑,合并所有工作项ID并去重即可,不需要合并流水线,完全符合你的现有技术栈要求。


内容的提问来源于stack exchange,提问作者nopassport1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 03:54:06