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

时间:2018-11-03 01:22:42

标签: typescript azure-devops azure-pipelines azure-pipelines-release-pipeline

我正在开发Azure DevOps扩展,该扩展包括添加附件的自定义任务。它可以在Build或Release管道中使用。

使用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

1 个答案:

答案 0 :(得分:0)

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

enter image description here

这两个作业的计划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

由于deployStep可以包含N(> 1)个阶段,因此层次结构有点复杂。每个阶段都可以包含多个作业(对于部署组和乘数,通常是这种情况,如果您不使用它们,则只是退回到DeploymentJobs [0])。在每个作业中,您在工作流程中配置了多个任务,每个任务创建自己的时间表。