VSTS(Azure DevOps)管道中的动态变量名称

时间:2020-05-25 10:05:51

标签: azure-devops azure-powershell

我有一个名为TestVariable的管道变量。

我可以像这样通过PS脚本轻松访问此变量:

write-host $(TestVariable)

但是,如果该变量的名称是动态的,那么有什么方法可以从PS中访问变量值?

例如,变量的名称将放入字符串变量中。我已经尝试过将这些组合用作实验...它们只是返回变量名,而不是值(毫不奇怪):

$varname="TestVariable"

write-host $($varname)
write-host $("$varname")
write-host $"($varname)"
write-host $("($varname)")

我认为答案是否定的,但我想确定。任何帮助,不胜感激!

编辑-注释

两个答案都能回答问题,但不能解决我的问题。在尝试解决方案之后,我意识到我错过了一个额外的麻烦,不幸的是,这些答案并没有帮助。如果有人尝试做类似的事情,请注意这里。

更为复杂的是,该变量的值是在发行期间设置的(我正在尝试访问ARM模板输出变量)。

我以为我可以使用API​​并获取“实时”变量值,但不幸的是,直到发行完成,发行数据才不存在(来自API)。

因此,当我在发布中称呼它时:

https://vsrm.dev.azure.com/ {company} / {project} / _ apis / release / releases / $($ releaseId)?api-version = 5.0

我得到“ ID 38的发布不存在”。

3 个答案:

答案 0 :(得分:2)

VSTS(Azure DevOps)管道中的动态变量名称

同意Krzysztof Madej。没有开箱即用的方法来实现这一目标。

因为在构建管道中尚不支持nested variables(如$($varname)

要解决此问题,您可以使用Definitions - Get来获取动态变量的值:

GET https://dev.azure.com/{organization}/{project}/_apis/build/definitions/{definitionId}?api-version=5.1

下面是我的测试powershell脚本:

$varname="TestVariable"

$url = "https://dev.azure.com/YourOrganizationName/YourtProjectName/_apis/build/definitions/<definitionsId>?api-version=5.0"

Write-Host "URL: $url"
$pipeline = Invoke-RestMethod -Uri $url -Headers @{
    Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"
}


$VFDV= $pipeline.variables.$varname.value


Write-Host This is Value For Dynamic Variable: $VFDV

enter image description here

输出:

enter image description here

希望这会有所帮助。

答案 1 :(得分:1)

这不可能直接在YAML中实现,但是您可以使用例如az cli。这样,您可以通过编程方式将变量名设置为它的获取值

$variableName = "some"

az pipelines variable list --org "https://dev.azure.com/thecodemanual" --project "DevOps Manual" --pipeline-name "DevOps Manual-CI" --query ($variableName + '.value')

$variableName = "test"

az pipelines variable list --org "https://dev.azure.com/thecodemanual" --project "DevOps Manual" --pipeline-name "DevOps Manual-CI" --query ($variableName + '.value')

现在,您可以在powershell任务中使用此代码来获取变量的值。

Here,您了解如何安装扩展程序。

答案 2 :(得分:0)

晚了聚会,但我想和大家分享。

Defined Variables doc中所述,可以通过以下方式访问管道变量 环境变量。虽然$(varname)在任务开始之前得到处理,但是$ env:varname可以在运行期间被调用。因此,您可以使用以下方法作弊:

Write-Host ('$env:'+"$(varname)" | Invoke-Expression")

任务将在任务开始前将$(varname)解析为其值。因此该脚本的读为

Write-Host ("$env:TestVariable" | Invoke-Expression)

它会吐出与调用$(TestVariable)相同的内容。

尽管您确实需要遵守规则,例如“”和“”。 ->“ _”。