在 YAML 管道中访问管道队列变量
Access Pipeline Queue variable in YAML pipeline
我在管道 UI 中创建了一个名为 Test
的变量,并将值留空。于是就出现了下图
我试图在 YAML 管道中访问此变量,但无法检查它是否为空值。
我正在这样尝试:
- variables
- name: 'Release'
${{ if or(eq(variables['Test'],''), eq(variables['Test'], 'undefined')) }}:
value: 'Stage'
${{ if and(ne(variables['Test'],''), ne(variables['Test'], 'undefined')) }}:
value: 'Test'
变量 Release
的值总是 Stage
无论 Test
变量是否为空或其中的任何值。
我想一定有一种简单的方法来检查变量值是否为空?
正确的检查是使用 not(...)
检查值是否已定义。但是,您似乎不能将这些变量用于编译时表达式,可能是因为模板此时已经编译过了。只有内置变量似乎适用于表达式。
至少,这对我来说总是 returns 空的:
variables:
- name: CopyVariable
value: ${{variables['testvariable']}}
您可以改用 Parameters。虽然最好在这里使用非空字符串作为默认值并限制可能的值。
parameters:
- name: testparam
type: string
default: ''
variables:
# Always empty
- name: CopyVariable
value: ${{variables['testvariable']}}
# Works fine
- name: CopyVariable2
value: ${{variables['Build.SourceBranch']}}
- name: ByParameter
${{ if not(parameters['testparam']) }}:
value: 'no param'
${{ if not(not(parameters['testparam'])) }}:
value: 'has param'
- name: ByVariable
# first one is always empty, second one works.
value: 'Compile time: ${{variables.testvariable}} -- Runtime: $(testvariable)'
steps:
- script: |
echo Hello, $(CopyVariable) - $(testvariable)
displayName: 'Copy Variable'
- script: |
echo Hello, $(CopyVariable2)
displayName: 'Copy Variable2'
- script: |
echo Hello, $(ByParameter)
displayName: 'By Parameter'
- script: |
echo Hello, $(ByVariable)
displayName: 'By Variable'
如果您需要检查变量是否为空,您不能在 YAML 中执行此操作。但是您可以在 Powershell 和日志记录命令中执行此操作以设置变量:
trigger:
- master
pool:
vmImage: 'ubuntu-latest'
jobs:
- job: Test
pool:
vmImage: 'ubuntu-latest'
variables:
varOS: $(Agent.OS)
steps:
- pwsh: |
$testVar = ''
$test = '$(Test)'
if ($test -eq 'undefined' -or $test -eq '') {
$testVar = "Stage";
} elseif ($test -ne 'undefined' -and $test -ne '') {
$testVar = "Test";
}
Write-Host $testVar
Write-Host "##vso[task.setvariable variable=Release;isOutput=true]$testVar"
name: Initialize
- pwsh: |
echo '$(Initialize.Release)'
我想分享另一种检查变量值是否为空的方法。
根据我的测试,条件可以获取队列变量。
您可以使用 Condition.
检查管道作业中的变量是否为空
Yaml示例如下:
steps:
- task: PowerShell@2
inputs:
targetType: 'inline'
script: Write-Host "##vso[task.setvariable variable=Release;]Stage"
condition: or(eq(variables['Test'],''), eq(variables['Test'], 'undefined'))
- task: PowerShell@2
inputs:
targetType: 'inline'
script: Write-Host "##vso[task.setvariable variable=Release;]Test"
condition: and(ne(variables['Test'],''), ne(variables['Test'], 'undefined'))
- script: echo $(Release)
' ' or Empty -> Release: Stage
不为空 -> 发布:测试
更新:
如果你还想在if表达式中使用queue变量,可以在yaml中定义一个变量,用它来获取queue变量的值进行判断。
示例如下:
variables:
- name: aaa
value: $[variables.test]
- name: Release
${{ if or(eq(variables['aaa'],''), eq(variables['aaa'], 'undefined')) }}:
value: 'Stage'
${{ if and(ne(variables['aaa'],''), ne(variables['aaa'], 'undefined')) }}:
value: 'Test'
我在管道 UI 中创建了一个名为 Test
的变量,并将值留空。于是就出现了下图
我试图在 YAML 管道中访问此变量,但无法检查它是否为空值。
我正在这样尝试:
- variables
- name: 'Release'
${{ if or(eq(variables['Test'],''), eq(variables['Test'], 'undefined')) }}:
value: 'Stage'
${{ if and(ne(variables['Test'],''), ne(variables['Test'], 'undefined')) }}:
value: 'Test'
变量 Release
的值总是 Stage
无论 Test
变量是否为空或其中的任何值。
我想一定有一种简单的方法来检查变量值是否为空?
正确的检查是使用 not(...)
检查值是否已定义。但是,您似乎不能将这些变量用于编译时表达式,可能是因为模板此时已经编译过了。只有内置变量似乎适用于表达式。
至少,这对我来说总是 returns 空的:
variables:
- name: CopyVariable
value: ${{variables['testvariable']}}
您可以改用 Parameters。虽然最好在这里使用非空字符串作为默认值并限制可能的值。
parameters:
- name: testparam
type: string
default: ''
variables:
# Always empty
- name: CopyVariable
value: ${{variables['testvariable']}}
# Works fine
- name: CopyVariable2
value: ${{variables['Build.SourceBranch']}}
- name: ByParameter
${{ if not(parameters['testparam']) }}:
value: 'no param'
${{ if not(not(parameters['testparam'])) }}:
value: 'has param'
- name: ByVariable
# first one is always empty, second one works.
value: 'Compile time: ${{variables.testvariable}} -- Runtime: $(testvariable)'
steps:
- script: |
echo Hello, $(CopyVariable) - $(testvariable)
displayName: 'Copy Variable'
- script: |
echo Hello, $(CopyVariable2)
displayName: 'Copy Variable2'
- script: |
echo Hello, $(ByParameter)
displayName: 'By Parameter'
- script: |
echo Hello, $(ByVariable)
displayName: 'By Variable'
如果您需要检查变量是否为空,您不能在 YAML 中执行此操作。但是您可以在 Powershell 和日志记录命令中执行此操作以设置变量:
trigger:
- master
pool:
vmImage: 'ubuntu-latest'
jobs:
- job: Test
pool:
vmImage: 'ubuntu-latest'
variables:
varOS: $(Agent.OS)
steps:
- pwsh: |
$testVar = ''
$test = '$(Test)'
if ($test -eq 'undefined' -or $test -eq '') {
$testVar = "Stage";
} elseif ($test -ne 'undefined' -and $test -ne '') {
$testVar = "Test";
}
Write-Host $testVar
Write-Host "##vso[task.setvariable variable=Release;isOutput=true]$testVar"
name: Initialize
- pwsh: |
echo '$(Initialize.Release)'
我想分享另一种检查变量值是否为空的方法。
根据我的测试,条件可以获取队列变量。
您可以使用 Condition.
检查管道作业中的变量是否为空Yaml示例如下:
steps:
- task: PowerShell@2
inputs:
targetType: 'inline'
script: Write-Host "##vso[task.setvariable variable=Release;]Stage"
condition: or(eq(variables['Test'],''), eq(variables['Test'], 'undefined'))
- task: PowerShell@2
inputs:
targetType: 'inline'
script: Write-Host "##vso[task.setvariable variable=Release;]Test"
condition: and(ne(variables['Test'],''), ne(variables['Test'], 'undefined'))
- script: echo $(Release)
' ' or Empty -> Release: Stage
不为空 -> 发布:测试
更新:
如果你还想在if表达式中使用queue变量,可以在yaml中定义一个变量,用它来获取queue变量的值进行判断。
示例如下:
variables:
- name: aaa
value: $[variables.test]
- name: Release
${{ if or(eq(variables['aaa'],''), eq(variables['aaa'], 'undefined')) }}:
value: 'Stage'
${{ if and(ne(variables['aaa'],''), ne(variables['aaa'], 'undefined')) }}:
value: 'Test'