Получите все рабочие элементы из Azure DevOps, которые были объединены в ветку с помощью JavaScript

#javascript #azure #azure-devops #azure-pipelines #azure-devops-rest-api

Вопрос:

Идея

В настоящее время я разрабатываю приложение «примечания к выпуску» с использованием NodeJS, которое вызывает различные конечные точки REST API Azure DevOps для получения рабочих элементов на основе определенного тега.

То, что у меня есть прямо сейчас

То, что у меня есть на данный момент, работает так;

  • Некоторые рабочие элементы в Azure DevOps помечены (пользовательскими) тегами v1.1 .
  • Функции JS, которые я написал, извлекают все рабочие элементы, соответствующие данному v1.1 тегу.
  • Запись вики создается с использованием сгенерированной уценки, показывающей разбивку каждого рабочего элемента (формат не важен для вопроса).
 /**
 * 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 ${releaseNumber}amp;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 тегом — но в случае, если я этого не сделаю, эта программа не обнаружит тот факт, что конкретный билет (и связанная с ним ветвь/ код) были объединены и ожидали/ ожидают выпуска — надеюсь, это имеет смысл?

Вопрос

Есть ли способ для меня получить все рабочие элементы (независимо от тега), которые были объединены в ветку (или тег git) через REST api?

Я заметил, что есть также azure-devops-node-api пакет npm, который может подойти, но я понятия не имею, возможно ли то, чего я пытаюсь достичь.

Почему я не могу использовать XYZ

Я видел этот проект https://marketplace.visualstudio.com/items?itemName=richardfennellBM.BM-VSTS-XplatGenerateReleaseNotes что, когда я попробовал, казалось, работало нормально, но не удовлетворяло моим потребностям, так как;

  1. Я не использую выделенный release раздел в DevOps, у меня просто есть несколько конвейеров приложений, которые содержат закрытые шаги, используемые для развертывания различных приложений в средах контроля качества/ промежуточных/ производственных средах
  2. Я использую один и тот же номер выпуска для нескольких конвейеров Azure DevOps (и вышеупомянутое решение (которое я нашел) лучше всего подходит для одного конвейера).
  3. Я не хочу объединять несколько конвейеров приложений в один главный, если мне это действительно не нужно.

Комментарии:

1. рабочие элементы не объединяются, код объединяется. как вы связываете свой рабочий элемент с кодом?

2. Рабочие элементы имеют связанные с ними ветви, а также PR

3. Поэтому соберите все рабочие элементы, проверьте связанный PR и отфильтруйте все PR, которые объединяются в master.

4. Хорошо, не могли бы вы подробнее рассказать о том, как этого можно достичь?

5. Я попытался уточнить в ответе, надеюсь, это понятно…

Ответ №1:

Примечание: Я не собираюсь писать, как это сделать, java-скрипт, потому что я не эксперт по js… идея заключается в rest api, поэтому язык не имеет значения.

  1. Получите все рабочие элементы, которые вы хотите проверить, вы можете сделать это с помощью вашего текущего api, просто в запросе удалите теги. (вы можете сузить результаты, указав дату и т.д.)
  2. Вы должны сделать также ССБ, которые связаны с рабочими элементами, эти данные не доступны с WIQL API-интерфейс, так после работы элементов идентификаторов, вам необходимо позвонить в рабочие элементы — сделать работу пользования пакетного API (или петли каждого из них и проанализировать рабочие элементы — Вам рабочий элемент API) и добавить $expand в тело/url со relations/all значением получите связаны сбн.
  3. После того, как у вас есть рабочие элементы со связанными с ними PR (в приведенном выше ответе api вы увидите relations раздел, и если внутри него указано url , vstfs:///Git/PullRequestId что это PR), вам нужно проверить, объединен ли PR в master ветку. как? с помощью Pull Requests — Получите api Pull Request, теперь проверьте целевую ветвь этого PR и проверьте, завершена ли (объединена).