从 TypeScript 扩展中的 Azure DevOps 发布部署中检索任务附件

Retrieve task attachment from an Azure DevOps release deployment in an TypeScript extension

我正在开发一个 Azure DevOps 扩展,其中包含一个添加附件的自定义任务。它可以在构建或发布管道中使用。

使用 npm 包 vss-web-extension-sdk 和 TypeScript,如何为特定 Release Pipeline 部署、特定环境和特定部署检索此附件的内容尝试?

最终目标是将附件内容(HTML)注入到 iframe 中,在发布的选项卡内容中。

这就是我卡住的地方:

import Controls = require("VSS/Controls");
import TFS_Build_Contracts = require("TFS/Build/Contracts");
import TFS_Build_Extension_Contracts = require("TFS/Build/ExtensionContracts");
import TFS_DistributedTask_Contracts = require("TFS/DistributedTask/Contracts");
import TFS_Release_Extension_Contracts = require("ReleaseManagement/Core/ExtensionContracts");
import TFS_Release_Contracts = require("ReleaseManagement/Core/Contracts");
import DT_Client = require("TFS/DistributedTask/TaskRestClient");
import RM_Client = require("ReleaseManagement/Core/RestClient");

// [...]

private async searchForAttachment(release: TFS_Release_Contracts.Release) {
    let vsoContext: WebContext = VSS.getWebContext();
    let rmClient = <RM_Client.ReleaseHttpClient5>RM_Client.getClient();
    let projectId = vsoContext.project.id;

    // For test purpose, target the last environment and last deployment attempt
    let env = release.environments[release.environments.length - 1];
    let attempt = env.deploySteps[env.deploySteps.length - 1];

    // Where I am supposed to retrieve "timelineId" ?
    let attachments = rmClient.getTaskAttachments(
        projectId, release.id, env.id, attempt.id, timelineId, 'my_attachment_type'
    );

    // The documentation says that the call above is deprecated, and I should use getReleaseTaskAttachments
    // But, where I am supposed to retrieve "planId" ?
    // Also, getReleaseTaskAttachments is undefined in the latest version of the npm package...
    attachments = rmClient.getReleaseTaskAttachments(
        projectId, release.id, env.id, attempt.id, planId, 'my_attachment_type'
    );
}

仅供参考,我已经能够从构建管道中检索附件,但它不适用于发布部署。它更简单,我在网上找到了足够的文档。

此外,我正在使用 task.addattachment 命令在自定义任务中添加附件:

##vso[task.addattachment type=myattachmenttype;name=myattachmentname;]c:\myattachment.txt

在配置发布定义时,您添加到工作流中的每个作业都会在发布触发时映射到 plan/planId。例如。当我根据工作流如下所示的定义对发布进行排队时,部署步骤对象 (env.deploySteps[env.deploySteps.length - 1]) 将包含两个发布部署阶段。

两个作业的计划 ID 可以检索为 -

env.deploySteps[env.deploySteps.length - 1].releaseDeployPhases[0].runPlanId
env.deploySteps[env.deploySteps.length - 1].releaseDeployPhases[1].runPlanId

作业中运行的每个任务(在本例中为 Bash 脚本)将创建用于检索日志和附件的时间线。 我将执行此操作以获取 BashScript

的时间线 ID
env.deploySteps[env.deploySteps.length - 1].releaseDeployPhases[0].deploymentJobs[0].tasks[0].timelineRecordId

层次结构有点复杂,因为一个部署步骤可以包含 N(>1) 个阶段。每个阶段都可以包含多个作业(通常是部署组和乘法器的情况,如果您不使用它们,则直接回退到 deploymentJobs[0])。在每个作业中,都有您在工作流中配置的多个任务,每个任务都创建了自己的时间线。