我在管道用户界面中创建了一个名为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
。
我认为必须有一种简单的方法来检查变量值是否为空?
答案 0 :(得分:0)
正确的检查方法是使用not(...)
检查值是否已定义。但是,似乎不能将这些变量用于编译时表达式,这可能是因为模板已在此时编译。似乎只有内置变量适用于表达式。
至少,这对我总是返回空:
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'
答案 1 :(得分:0)
如果要检查变量是否为空,则无法在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)'
答案 2 :(得分:0)
我想分享另一种方法来检查变量值是否为空。
根据我的测试,条件可以获取队列变量。
您可以使用Condition.
检查Pipeline Job中变量是否为空。这是Yaml样本:
student_id
''或为空->发布:阶段
非空->发布:测试
更新:
如果仍要在if表达式中使用队列变量,则可以在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)