Извлечение файла журнала конкретной задачи сборки в конвейере с несколькими заданиями в выпусках Azure DevOps

#azure-devops #azure-devops-rest-api #azure-devops-extensions #vssdk

#azure-devops #azure-devops-rest-api #azure-devops-extensions #vssdk

Вопрос:

У нас есть расширение Azure DevOps, в котором одна из задач сборки использовалась для получения данных из журнала сборки выпуска для отображения на вкладке сводка выпуска. Эта задача сборки идеально подходит для конвейеров заданий с одним агентом, но мы столкнулись со сценарием, в котором доступно несколько заданий агента, и мы не смогли получить данные, как только наша задача сборки была добавлена ко второму или более позднему заданию агента.

введите описание изображения здесь

Ниже показано, как мы получаем данные из журналов задач. Однако этот метод выполняет итерацию только через первое задание и не обращается ко второму. Мы используем клиент управления выпусками из «ReleaseManagement / Core / RestClient» в VSS SDK

    //getting list of tasks
    var t = await rmClient.getTasks(VSS.getWebContext().project.id, release.id, environment.id);
    // iterate trough task list until required task found
    for (var i = 0; i < t.length; i  ) {
        var currentTask = t[i];               
        
        var logData = await rmClient.getLog(VSS.getWebContext().project.id, release.id, environment.id, currentTask.id, environment.deploySteps.length);  

        // Identify task based on data in it
        break;
    }
  

В соответствии с реализацией SDK для извлечения журналов доступны два метода getlog, который возвращает журнал задачи в виде строки (тот, который мы используем сейчас), и getLogs, который возвращает все журналы в виде ArrayBuffer

 /**
     * [Preview API] Gets logs
     *
     * @param {string} project - Project ID or project name
     * @param {number} releaseId - Id of the release.
     * @param {number} environmentId - Id of release environment.
     * @param {number} taskId - ReleaseTask Id for the log.
     * @param {number} attemptId - Id of the attempt.
     * @return IPromise<string>
     */
    getLog(project: string, releaseId: number, environmentId: number, taskId: number, attemptId?: number): IPromise<string>;
    /**
     * [Preview API] Get logs for a release Id.
     *
     * @param {string} project - Project ID or project name
     * @param {number} releaseId - Id of the release.
     * @return IPromise<ArrayBuffer>
     */
    getLogs(project: string, releaseId: number): IPromise<ArrayBuffer>;
  

Как вы можете заметить, в этих методах нет места для указания задания агента.

Если у кого-то есть опыт работы с этим,

  1. Возможно ли получить данные журнала из второго или более позднего задания в конвейере выпуска? образец / документация были бы очень полезны.
  2. Я пытался получить данные из буфера массива, но в итоге при попытке преобразовать ArrayBuffer в string ошибка выходит из-за границы.

Любые мысли, советую высоко ценится 😊

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

1. Вы проверили мой ответ? Полезно ли это?

2. Мы поработаем над этим и скоро свяжемся с вами.. Спасибо.

3. С нетерпением ждем ваших обновлений.

Ответ №1:

Чтобы получить журнал задач из задания агента, вам также необходимо releaseDeployPhaseId . Проверьте следующий API:

https://learn.microsoft.com/en-us/rest/api/azure/devops/release/releases/get task log?view=azure-devops-rest-6.0

GET https://vsrm.dev.azure.com/{organization}/{project}/_apis/release/releases/{releaseId}/environments/{environmentId}/deployPhases/{releaseDeployPhaseId}/tasks/{taskId}/logs?api-version=6.0-preview.2

Вы можете вызывать REST API из своего расширения, как указано в этой документации:

https://learn.microsoft.com/en-us/azure/devops/extend/develop/auth?view=azure-devops#calling-rest-apis-from-your-extension