枚举Azure Pipelines中的机密变量

时间:2018-08-21 05:14:03

标签: azure-devops azure-pipelines-build-task azure-pipelines-task-lib

我在Azure Pipelines中有一个构建步骤,该步骤从Azure Pipelines中获取变量并将它们上传到同样秘密的地方。目前,我有大约50个构建,每个构建都有5-20个变量。

有些是秘密的,有些不是。因此,对于非秘密的人,我会列举所有已设置的人,然后我就去了;但是对于秘密文件,我需要手动将它们添加到构建步骤中;此外,因为我使用相同的键来编写它们,所以我需要:

  1. 在组中声明变量,例如MyPrefix.MyVar
  2. 编辑构建步骤以说/specialtool --vars=MyPrefix.MyVar=$(MyPrefix.MyVar),这很平凡。

我发现我可以使用Azure DevOps api获取变量列表,因此我认为我可以在构建运行时修改下一个构建步骤。

但是,如果我更新当前正在运行的同一构建定义(以动态编写命令),则不会将其发送到代理(相反,感觉是在触发整个构建时都捕获了所有任务参数) 。关于如何动态枚举秘密var以馈入我的工具的任何想法?

3 个答案:

答案 0 :(得分:0)

您可以在构建过程中使用VSTS Logging Commands更新变量值。这将使更新的变量在下一个构建任务中可用。

Write-Host "##vso[task.setvariable variable=testvar;]testvalue"

答案 1 :(得分:0)

所以我也一直在寻找解决方案。目前看来,执行此操作的唯一方法是编写自定义任务。在自定义任务中,您可以动态获取机密值。

一个示例是“ vsts-replacetokens-task”(https://github.com/qetza/vsts-replacetokens-task/blob/master/task/index.ts

内部使用vsts任务库(vsts-task-lib / task) (https://github.com/Microsoft/azure-pipelines-task-lib/blob/master/node/task.ts

此vsts任务库提供了诸如GetVariables()和GetVariable()等方法,这些方法可以提供您所需的内容。不幸的是有点ed绕,但这是我唯一能看到的方式。

答案 2 :(得分:0)

创建Typescript自定义任务(基于NodeJS)时,您可以通过the getVariable api.

访问当时可用于构建的所有构建变量。

此函数返回VariableInfo的数组:

/** Snapshot of a variable at the time when getVariables was called. */
export interface VariableInfo {
    name: string;
    value: string;
    secret: boolean;
}

创建PowerShell3自定义任务时,可以通过the Get-VstsTaskVariable function.

访问该时间点可用于该构建的所有构建变量。

哪个返回与Node版本类似的对象结构:

New-Object -TypeName psobject -Property @{
    Name = $info.Name
    Value = Get-TaskVariable -Name $info.Name
    Secret = $info.Secret
}

如果您还需要支持TFS 2015和1.x构建代理,则可以使用(现已弃用)PowerShell处理程序,并使用自定义的powershell函数I describe here枚举机密。

每个任务SDK(Typescript和Powershell)都支持设置变量的功能。这是打字稿中setting the variable value的示例:

tl.setVariable(variable, value, isSecret);

在PowerShell3上:

Set-VstsTaskVariable -name $VariableName -value $Value -Secret $IsSecret

在PowerShell上(不建议使用):

Write-Host "##vso[task.setvariable variable=$($VariableName);issecret=$($IsSecret)]$Value"

我的怀疑是,您想创建一个读取变量并调用您在原始文章中提到的命令的任务,然后将这些变量发布到其他秘密存储中。不建议读取所有机密并将其存储在非机密变量中,或者以某种方式将其传递给下一个任务。