Azure DevOps:通过将其他变量的值连接为任务输入来获取变量值

时间:2019-08-13 16:32:06

标签: azure-devops azure-pipelines azure-pipelines-release-pipeline

我将发布管道的“变量”标签设置为:

Environment variables

我想通过连接initialVariable的结果来访问任务显示名称中的my123变量。

  

输出

到目前为止,我尝试仅引用initialVariable,并且它在Job的显示名称中返回了正确的值。

enter image description here

但是当我尝试通过使用initialVariable(= 123)创建my123值时,我没有得到正确的值(希望$(initialVariable)可以转换为123,而$(my123)可以得到正确的“ finalValue”)。

enter image description here

2 个答案:

答案 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

管道中的示例

Powershell

enter image description here

YAML

# 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)"

结果

enter image description here

答案 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,我添加了命令行任务以显示值:

enter image description here

结果是,命令行任务中的值是正确的finalvalue。但是显示名称仍为$(my123)

enter image description here

重要提示:

这也是您评论中的问题。此行为是预期的。那是因为显示名称中的变量仅用于获取预定义的值。它是静态获取,不是动态获取。运行powershell时分配了变量my123。显示名称中的静态变量my123不会进入运行Powershell代码的环境。

因此,标题中的变量my123无法在任务Powershell中获取值。但是其他任务可能会很好地使用它。

希望这个答案可以解决您的难题。