0

我在 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为空或其中的任何值。

我认为必须有一种简单的方法来检查变量值是否为空?

4

3 回答 3

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)'
于 2020-07-18T05:18:03.600 回答
0

我想分享另一种方法来检查变量值是否为空。

根据我的测试,条件可以得到队列变量。

您可以在带有条件的管道作业中检查变量是否为空。

这是 Yaml 示例:</p>

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)

' ' 或 Empty -> Release: Stage

非空 -> 发布:测试

更新:

如果还想在if表达式中使用队列变量,可以在yaml中定义一个变量,用它来获取队列变量的值进行判断。

这是示例:

 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'
 


 
于 2020-07-20T08:56:23.497 回答
0

正确的检查将not(...)用于检查值是否已定义。但是,您似乎不能将这些变量用于编译时表达式,可能是因为此时模板已经编译。只有内置变量似乎适用于表达式。

至少,这对我来说总是空的:

variables:
  - name: CopyVariable
    value: ${{variables['testvariable']}}

您可以改用参数。虽然最好在此处使用非空字符串作为默认值并限制可能的值。

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'
于 2020-07-17T21:53:30.053 回答