通过JavaScript获取从Azure DevOps合并到分支中的所有工作项

4

这个想法

我目前正在使用NodeJS开发一个“发布说明”应用程序,它调用各种Azure DevOps REST API终端点,以根据特定标签获取工作项。

我现在拥有的

我目前所拥有的工作方式如下:

  • 某些 Azure DevOps上的工作项被(定制)标记为v1.1
  • 我编写的JS函数可以获取所有匹配给定v1.1标签的工作项。
  • 使用生成的Markdown创建了一个Wiki条目,显示每个工作项的详细信息(格式对问题不重要)。
/**
 * Function used to fetch initial work items from Azure DevOps that match the provided release number
 * @param {String} releaseNumber - the given release number
 * @returns {Array} workItems - the initial work items fetched from Azure DevOps
 */
async function fetchWorkItems(releaseNumber) {
    console.log('\nFetching work items for given release number...');
    let response;
    try {
        response = await axios.post('https://dev.azure.com/myTestOrg/myTestProject/_apis/wit/wiql?api-version=6', {
            query: `SELECT [State], [Title] FROM WorkItems WHERE [Tags] CONTAINS '${releaseNumber}'`
        }, {
            headers: {
                Authorization: getAuthToken()
            }
        });
        console.log(`Found ${response.data.workItems.length} work item(s).`);
    } catch (e) {
        console.error('\nUnable to fetch work items. See below error message');
        console.error(e.message);
        process.exit(1);
    }

    return response.data.workItems;
}

/**
 * Function used to fetch the details for a given array of work items
 * @param {Array} givenWorkItems - given array of work items to fetch the details for
 * @returns {Array} details - the initial work items fetched from Azure DevOps
 */
async function fetchWorkItemDetails(givenWorkItems) {
    console.log('\nFetching further details for the given work item(s)...');
    const returnData = [];
    let response;

    for (const item of givenWorkItems) {
        try {
            // eslint-disable-next-line no-await-in-loop
            response = await axios.get(item.url, {
                headers: {
                    Authorization: getAuthToken()
                }
            });
        } catch (e) {
            console.error('\nUnable to fetch details for given work items. See below error message');
            console.error(e.message);
            process.exit(1);
        } finally {
            returnData.push({
                type: response.data.fields['System.WorkItemType'],
                title: response.data.fields['System.Title'],
                url: response.data._links.html.href
            });
        }
    }

    console.log(`Found details for ${returnData.length} work item(s).`);
    return returnData;
}

...

/**
 * Function used to create the wiki entry based on a given markup string
 * @param {String} releaseNumber - the given release number
 * @param {String} givenMarkdown - given array of work items to fetch the details for
 * @returns {undefined} nothing
 */
async function createWiki(releaseNumber, givenMarkdown) {
    console.log('\nCreating wiki entry...');
    try {
        await axios.put(`https://dev.azure.com/myTestOrg/myTestProject/_apis/wiki/wikis/myTestProject.wiki/pages?path=/Releases/Release%20${releaseNumber}&api-version=6.0`, {
            content: givenMarkdown
        }, {
            headers: {
                Authorization: getAuthToken()
            }
        });
    } catch (e) {
        console.error('\nUnable to create wiki entry for given markdown. See below error message');
        console.error(e.message);
        process.exit(1);
    } finally {
        console.log('Successfully created wiki entry.');
    }
}

...

const workItems = await fetchWorkItems(releaseNumber);
const workItemDetails = await fetchWorkItemDetails(workItems);
const formattedDetails = formatWorkItemDetails(workItemDetails);
const generatedMarkup = generateMarkdown(formattedDetails);
await createWiki(releaseNumber, generatedMarkup);
...

// creates the wiki based on the given `releaseNumber` variable
// (which is the workitem tag of `v1.1` in our case)

为什么我现在拥有的还不够好

如果我记得用正确的v1.1标签标记工作项,则此应用程序可以正常工作 - 但是万一我没有这样做,该程序将无法发现特定票(及其关联的分支/代码)已被合并并正在等待发布 - 我希望这有意义?

问题

是否有一种通过REST API获取所有已合并到分支(或Git标记)中的工作项(无论标签如何)的方法?

我注意到还有一个azure-devops-node-api npm包,可能适用,但我不知道我要实现的目标是否可行。

为什么我不能使用XYZ

我看到了这个项目https://marketplace.visualstudio.com/items?itemName=richardfennellBM.BM-VSTS-XplatGenerateReleaseNotes,试用后似乎可以正常工作,但不适合我的需求,因为:

  1. 我没有在 DevOps 中使用专用的release部分,我只有几个包含门控步骤以将各种应用程序部署到 QA / Staging / Production 环境的应用程序管道
  2. 我在多个 Azure DevOps 管道中共享相同的发布号码(我找到的上述解决方案最适用于单个管道)
  3. 除非我真的需要,否则我不想将几个应用程序管道合并为单个主管道。

工作项不是合并,代码被合并。你如何在工作项和代码之间建立链接? - Shayki Abramczyk
工作项与它们关联的分支以及 PR 相连。 - nopassport1
获取所有工作项,检查关联的 PR 并过滤所有合并到主分支的 PR。 - Shayki Abramczyk
好的,您能详细说明如何实现吗? - nopassport1
我在回答中尽力阐述了,希望能够理解... - Shayki Abramczyk
1个回答

0
注意:我不会写如何使用JavaScript,因为我不是js专家......这个想法是REST API,所以语言并不重要。
获取要检查的所有工作项,您可以使用当前的api完成,在查询中删除标签即可(您可以通过指定日期等方式缩小结果范围)。
您还需要获取与工作项相关联的PR,这个数据在WIQL api中不可用,因此 - 在您获取到工作项ID之后,您需要调用Work Items - Get Work Items Batch api(或循环每一个并执行Work Items - Get Work Item api),并在body/url中添加$expand和值为relations/all以获取关联的PR。
在获取了具有其链接的PR的工作项之后(在上面的api响应中,您将看到relations部分,并且如果其中的urlvstfs:///Git/PullRequestId,那么它就是PR),您需要检查该PR是否合并到master分支。 如何做到呢? 使用Pull Requests - Get Pull Request api,现在,检查此PR的目标分支并检查是否已完成(已合并)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接