2

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

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

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

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

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

4

3 回答 3

0

当您创建 Typescript 自定义任务(基于 NodeJS)时,您可以通过api访问当时可用于构建的所有构建变量。getVariable

此函数返回一个数组VariableInfo

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

创建 PowerShell3 自定义任务时,您可以通过Get-VstsTaskVariable 函数访问当时可用于构建的所有构建变量。

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

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

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

每个任务 SDK(Typescript 和 Powershell)也支持设置变量的函数。这是在 Typescript中设置变量值的示例:

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"

我的怀疑是你想创建一个任务来读取变量并调用你在原始帖子中提到的命令,然后将这些变量发布到另一个秘密存储。不建议阅读所有秘密并将它们存储在非秘密变量中或以某种方式将它们传递给下一个任务。

于 2019-04-10T10:50:28.313 回答
0

您可以使用VSTS 日志记录命令在构建期间更新变量值。这将使更新的变量在下一个构建任务中可用。

Write-Host "##vso[task.setvariable variable=testvar;]testvalue"
于 2018-09-05T08:09:25.493 回答
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() 等方法,可以提供你需要的东西。不幸的是有点啰嗦,但我能看到的唯一方法。

于 2019-04-10T10:31:49.753 回答