在 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'