如何通过JavaScript获取Azure DevOps中已合并入分支的所有工作项
方案可行性说明
你要实现的需求完全可行,核心逻辑是通过Git提交/标签的范围查询关联的PR,再从PR中提取绑定的工作项,不需要依赖工作项的自定义标签,也不需要用到Azure DevOps的Release模块,完美适配你当前多流水线共用版本号的场景。
实现逻辑
Azure DevOps中只要开发在提交PR时关联了对应工作项(这是绝大多数研发团队的标配规范),你可以通过以下步骤拉取指定分支/标签范围内的所有工作项:
- 确定版本对应的提交范围:比如上一个版本的Git标签对应的commit hash,和本次要发布的分支最新commit hash(或本次版本的Git标签对应的commit hash)
- 查询提交范围内所有已合并到目标分支的PR
- 批量提取所有PR关联的工作项ID,去重后查询工作项详情
- 后续生成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
相关产品推荐
相关产品推荐

