如何在条件下访问管道变量

时间:2020-09-14 09:53:36

标签: azure azure-devops azure-pipelines

我有运行模板的步骤之一。

我需要执行带有两个不同参数范围的模板,具体取决于管道变量之一的值。

例如,如果管道变量'mode'具有值'dev',则我需要在一个范围内运行模板,如果值是'stage',则是另一范围。

  - ${{ if eq(parameters.mode, 'dev') }}:
    - template: ../template.yaml
      parameters:
          mode: dev
          namespace: dev-namespace
          fqdn: dev-fqdn

    
  - ${{ if eq(variables.mode, 'staging') }}:
    - template: ../template.yaml
      parameters:
        mode: staging
        namespace: staging-namespace
        fqdn: staging-fqdn

3 个答案:

答案 0 :(得分:0)

您应使用此语法${{ if eq(variables['mode'], 'staging') }}:

答案 1 :(得分:0)

这取决于变量将在何时read in at and used。还有更多可能的答案。 enter image description here

如果将它们用于将来执行模板,我建议使用condition并定义单独的yml变量文件中的参数。

  condition:  eq('${{ variables.mode}}', 'staging)

那样,通话将只是

   job:
    condition:  eq('${{ variables.mode}}', 'staging')
    variables: staging.yml
    - template: ../template.yaml
      parameters:
        mode: ${{ variables.mode }}
        namespace: ${{ variables.namepsace }}
        fqdn: ${{ variables.fqdn }} 

staging.yml看起来像:

variables:
   mode: staging
   namespace: staging-namespace
   fqdn: staging-fqdn

通过这种方式,它的耦合性和可伸缩性有所降低,而不必每次都对其进行硬编码。

答案 2 :(得分:0)

1。如果您使用的是runtime parameters,则可以使用以下格式:

trigger:
- master

parameters:
- name: mode
  displayName: Choose mode
  type: string
  default: dev
  values:
  - dev
  - staging

pool:
  vmImage: 'windows-latest'

steps:
  - ${{ if eq(parameters.mode, 'dev') }}:
    - template: template.yml
      parameters:
        mode: dev
  - ${{ if eq(parameters.mode, 'staging') }}:
    - template: template.yml
      parameters:
        mode: staging

有关更多详细信息,请检查Parameters to select a template at runtime

2。如果直接使用yaml中定义的变量,请检查我的另一个示例:

trigger:
- master

variables:
  mode: staging

pool:
  vmImage: 'windows-latest'

stages:
- stage: Dev
  condition: eq(variables.mode, 'dev')
  jobs:
  - job:
    steps:
      - template: template.yml
        parameters:
          mode: dev

- stage: Staging
  condition: eq(variables.mode, 'staging')
  jobs:
  - job:
    steps:
      - template: template.yml
        parameters:
          mode: staging

我建议使用运行时参数方式,因为它更方便,更灵活。

更新1:

这是我简单的template.yml文件,仅供测试:

parameters:
- name: mode
  type: string
  default: default

steps:
- script: echo ${{ parameters.mode }}