我将发布管道的“变量”标签设置为:
我想通过连接initialVariable的结果来访问任务显示名称中的my123变量。
输出
到目前为止,我尝试仅引用initialVariable,并且它在Job的显示名称中返回了正确的值。
但是当我尝试通过使用initialVariable(= 123)创建my123值时,我没有得到正确的值(希望$(initialVariable)可以转换为123,而$(my123)可以得到正确的“ finalValue”)。
答案 0 :(得分:0)
就像我在评论中提到的那样,我认为默认情况下您不会在UI中使用它。
幸运的是,如果您确实需要基于另一个变量的值来寻址变量名称的功能,则可以使用PowerShell一起破解。
通过环境变量,您的Powershell脚本 FILE (非内联)可使用构建或发行管道定义中的所有变量(对秘密的处理有所不同) (即$env:initialVariable
)。
selector = selectable1 //this is the value that can change
selectable1 = theFirstSelection
selectable2 = theSecondSelection
selectable3 = theThirdSelection
在这种情况下(假设我理解您的要求),您希望能够更改selector
的值并强制任务访问相应的selectable
变量。
在管道中定义一个新变量。
selector = selectable1 //this is the value that can change
selected = "" //this is the variable you use in your tasks
selectable1 = theFirstSelection
selectable2 = theSecondSelection
selectable3 = theThirdSelection
编写一个 VariableSelection .ps1 脚本。在使用$(selected)
之前,需要运行此powershell脚本来为其赋值。
# VariableSelection.ps1
Write-Host "select variable: $env:selector"
$selectedValue = (gci env:"$env:selector").value
Write-Host "##vso[task.setvariable variable=selected]$selectedValue"
注意:据我观察,如果您内联编写此脚本,将无法正常工作,因为从文件运行的脚本的环境变量功能有所不同。
鉴于$(selector)
的值为selectable2
,则在运行脚本时,$(selected)
的值为theSecondSelection
。
# Starter pipeline
# Start with a minimal pipeline that you can customize to build and deploy your code.
# Add steps that build, run tests, deploy, and more:
# https://aka.ms/yaml
trigger:
- master
pool:
name: Hosted VS2017
variables:
- name: "selector"
value: "var1"
- name: "selected"
value: ""
- name: "var1"
value: "var1_value"
- name: "var2"
value: "var2_value"
steps:
- task: PowerShell@2
inputs:
filePath: '$(build.sourcesdirectory)/varSelector.ps1'
- task: PowerShell@2
inputs:
targetType: 'inline'
script: |
Write-Host "env:selected: $env:selected"
Write-Host "selected: $(selected)"
答案 1 :(得分:0)
Azure DevOps:通过串联其他变量的值作为任务输入来获取变量值
这是一个已知问题。因为在构建/发布管道中尚不支持嵌套变量的值(例如$(my $(initialVariable))。
检查my other thread以获得一些详细信息。
解决方法是添加一个Run Inline Powershell
任务,以根据输入管道变量设置变量,就像Josh回答的那样。
对于您而言,我通过以下Powershell脚本对其进行测试:
if ($(initialVariable)-eq "123")
{
Write-Host "##vso[task.setvariable variable=my123]finalvalue"
}
else
{
Write-Host "##vso[task.setvariable variable=my123]otherValue"
}
然后我们可以在以下任务中基于变量my123
的值获取变量initialVariable
,我添加了命令行任务以显示值:
结果是,命令行任务中的值是正确的finalvalue
。但是显示名称仍为$(my123)
:
重要提示:
这也是您评论中的问题。此行为是预期的。那是因为显示名称中的变量仅用于获取预定义的值。它是静态获取,不是动态获取。运行powershell时分配了变量my123
。显示名称中的静态变量my123
不会进入运行Powershell代码的环境。
因此,标题中的变量my123
无法在任务Powershell中获取值。但是其他任务可能会很好地使用它。
希望这个答案可以解决您的难题。