【问题标题】:Azure Pipeline use template expression with queued variablesAzure Pipeline 使用带有队列变量的模板表达式
【发布时间】:2020-12-11 01:30:50
【问题描述】:

我在 azure 中定义了一个 YAML 构建管道:

variables:
  test: '${{ variables.Environment }}'

pool:
  vmImage: 'ubuntu-latest'

steps:
- script: |
    echo $(test)
  displayName: 'Show test'

我使用定义为“abc”的环境变量对该管道进行排队:

我希望它是 echo abc,但 abc 被替换为空 - variables.Environment 似乎未定义。

稍后我想根据环境变量加载不同的变量组,这就是我不直接在脚本中回显 $(Environment) 的原因。这只是一个简化的例子。

【问题讨论】:

  • 如果您尝试将 echo 语句更改为 echo $(Environment) 会发生什么?
  • 按预期工作,'abc' 被打印到控制台。当模板表达式变量被扩展时,似乎队列时间变量在编译时未定义

标签: azure variables time queue azure-pipelines


【解决方案1】:

我希望它回显 abc 但 abc 被替换为空 - variables.Environment 似乎未定义。

根据this document

运行时发生在模板扩展之后。模板变量在编译时处理,并在运行时开始之前被替换。当找不到替换值时,模板变量会静默合并为空字符串。

所以在你的情况下echo $(test) 只打印空字符串。因为队列变量用于运行时。为此,您可以考虑使用用于运行时的宏或运行时表达式。 test: $(Environment)test: $[variables.Environment] 在我这边工作得很好。

稍后我想加载不同的变量组,具体取决于 环境变量,这就是为什么我不回显 $(Environment) 直接在脚本中。这只是一个简化的例子。

据我所知,目前还不支持根据动态 Environment 变量链接不同的变量组,这里是关于该主题的 one discussion。在那种情况下,这是一个很好的workaround

现在 Azure Devops Service 正在推出新功能runtime parameters,我认为它可以满足您的大部分需求。它可能是您更好的选择,使用运行时参数而不是不支持的动态 Environment 变量。

我对这个选项的简单测试:

1.yaml中的内容:

parameters:
- name: group
  displayName: Group Name
  type: string
  default: TestGroup
  values:
  - TestGroup
  - Group2
  - Group3
  - Group4

variables:
- group: ${{ parameters.group }}

steps:
- script: |
    echo $(Name)
  displayName: 'Show group name'

2.我的变量组TestGroup:

3.点击运行管道:

4.管道运行良好,显示变量组中定义的变量:

希望对你有帮助:)

【讨论】:

    【解决方案2】:

    这个问题的变体:

    TL;DR:

    组变量在模板编译时似乎不可用,例如当基于该组中的变量有条件地设置要运行的模板时 - 似乎只有在管道中显式设置的变量可用。

    长版:

    我有一组变量组; 'Group-NonProd'、'Group-Prod' 等。每个都包含变量 'identifier',具有不同的值(以下示例为“dev”、“prod”)。

    我有一个主管道“main-pipeline.yml”,其中有几个阶段,每个阶段对应于“标识符”的值,例如:

    - stage: NonProd
      variables:
      - group: 'Group-NonProd' ## includes the variable 'identifier' with value "nonprod"
      jobs:
      - template: nonprod.yml
        parameters:
          identifier: $(identifier)
      - script: echo "environment is $(identifier)"
    
    - stage: Prod
      variables:
      - group: 'Group-Prod' ## includes the variable 'identifier' with value "prod"
      jobs:
      - template: prod.yml
        parameters:
          identifier: $(identifier)
      - script: echo "environment is $(identifier)"
    

    但是,当我运行管道时,参数“标识符”不会扩展到组变量“标识符”中的值 - 它是空白的 - 我看到当我尝试在以下条件逻辑中使用变量时(目的是使用此逻辑来确定调用哪个模板 - 查看注释掉的行 - 并将该参数传递给它们):

    steps:
      - ${{ if eq(parameters.identifier, 'nonprod') }}:
        # - template: nonprod.yml
        - script: echo "Using nonprod template, environment is ${{ parameters.identifier }}"
      - ${{ if not(eq(parameters.identifier, 'prod')) }}:
        # - template: prod.yml
        - script: echo "Using prod template, environment is ${{ parameters.identifier }}"
    

    上面的脚本总是求助于第二个条件,因为结果总是“Using prod template, environment is”(空白)。

    但奇怪的是 - 如果我在每个阶段明确设置变量“标识符”,它确实有效!

    例如这行得通:

    - stage: NonProd
      variables:
      - group: 'Group-NonProd'
      - name: identifier
        value: nonprod
      jobs:
      - template: nonprod.yml
        parameters:
          identifier: $(identifier)
      - script: echo "environment is ${{ parameters.identifier }}" 
    

    【讨论】:

      猜你喜欢
      • 2021-01-03
      • 1970-01-01
      • 2020-08-06
      • 2020-10-30
      • 1970-01-01
      • 2014-01-02
      • 2021-12-13
      • 2019-01-18
      • 2018-07-29
      相关资源
      最近更新 更多