YAML管道中的访问管道队列变量

时间:2020-07-17 20:43:05

标签: azure azure-devops yaml devops multistage-pipeline

我在管道用户界面中创建了一个名为Test的变量,并将该值保留为空白。如下图所示。

enter image description here

我正在尝试在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

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

3 个答案:

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