簡體   English   中英

通過JavaScript獲取Azure DevOps所有已合並到分支的工作項

[英]Obtain all work items from Azure DevOps that have been merged into a branch via JavaScript

這個想法

我目前正在使用 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 package 可能合適,但我不知道我想要實現的目標是否可行。

為什么我不能使用 XYZ

我看到這個項目https://marketplace.visualstudio.com/items?itemName=richardfennellBM.BM-VSTS-XplatGenerateReleaseNotes當我嘗試它時,它似乎工作正常但不適合我的需要;

  1. 我不使用 DevOps 中的專用release部分,我只有幾個應用程序管道,其中包含用於將各種應用程序部署到 QA/暫存/生產環境的門控步驟
  2. 我在多個 Azure DevOps 管道中共享相同的版本號(並且上述解決方案(我發現)最適合單個管道)
  3. 除非我真的需要,否則我不想將多個應用程序管道組合成一個主管道。

注意:我不會寫how to do it java腳本因為我不是js專家...思路是rest api,所以語言無所謂。

  1. 獲取所有要檢查的工作項,你可以用你現在的api來完成,只需在查詢中刪除Tags。 (您可以通過指定日期等縮小結果范圍)

  2. 您還需要獲取鏈接到工作項的 PR, WIQL api不提供此數據,因此 - 在您獲得工作項 ID 后,您需要調用工作項 - 獲取工作項批次api(或循環每個和執行Work Items - Get Work Item api) 並在 body/url 中添加$expandrelations/all值以獲取鏈接的 PR。

  3. 在您擁有與其鏈接的 PR 的工作項之后(在上面的 api 響應中,您將看到relations部分,如果在其中urlvstfs:///Git/PullRequestId所以它是 PR),您需要檢查 PR 是否已合並到master分支。 如何? 使用Pull Requests - Get Pull Request api,現在,檢查此 PR 的目標分支並檢查是否已完成(合並)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM