我在Azure Pipelines中有一个构建步骤,该步骤从Azure Pipelines中获取变量并将它们上传到同样秘密的地方。目前,我有大约50个构建,每个构建都有5-20个变量。
有些是秘密的,有些不是。因此,对于非秘密的人,我会列举所有已设置的人,然后我就去了;但是对于秘密文件,我需要手动将它们添加到构建步骤中;此外,因为我使用相同的键来编写它们,所以我需要:
MyPrefix.MyVar
/specialtool --vars=MyPrefix.MyVar=$(MyPrefix.MyVar)
,这很平凡。我发现我可以使用Azure DevOps api获取变量列表,因此我认为我可以在构建运行时修改下一个构建步骤。
但是,如果我更新当前正在运行的同一构建定义(以动态编写命令),则不会将其发送到代理(相反,感觉是在触发整个构建时都捕获了所有任务参数) 。关于如何动态枚举秘密var以馈入我的工具的任何想法?
答案 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"
我的怀疑是,您想创建一个读取变量并调用您在原始文章中提到的命令的任务,然后将这些变量发布到其他秘密存储中。不建议读取所有机密并将其存储在非机密变量中,或者以某种方式将其传递给下一个任务。