【问题标题】:How to inherit parameters from yaml template如何从 yaml 模板继承参数
【发布时间】:2021-12-22 14:02:41
【问题描述】:

有没有更好的方法来引用基本模板而不复制参数?

我有一个基本的 yaml 模板...

parameters:
  name: buildapp1
  type: boolean
  name: buildapp2
  type: boolean
  name: buildapp3
  type: boolean

...并且需要从多个管道中引用它:

parameters:
  name: buildapp1
  type: boolean
  name: buildapp2
  type: boolean
  name: buildapp3
  type: boolean

- template: basetemplate.yaml
  parameters:
    buildapp1: ${{ parameters.buildapp1 }}
    buildapp2: ${{ parameters.buildapp2 }}
    buildapp3: ${{ parameters.buildapp3 }}

更新:

如果我可以指定一个 UI 变量“环境”,然后在排队时解决这个问题,那就太好了。

我尝试了以下方法,但结果是“意外值”。

varaibles:
  - template: $(environment).yaml
  - template: ${{ environment }}.yaml

【问题讨论】:

    标签: azure-devops azure-pipelines-yaml


    【解决方案1】:

    更新问题后:


    管道:

    parameters:
      - name: environment
        type: string
        displayName: To which environment does the pipeline have to run?
        default: temp1
        values: 
          - temp1
          - temp2
    
    steps:
      - template: ${{ parameters.environment }}.yml
    

    选择temp1后的结果


    问题更新前


    一种方法是通过变量。

    变量范围

    在 YAML 文件中,您可以在各种范围内设置变量:

    在根级别,使其可用于管道中的所有作业。 在阶段级别,使其仅可用于特定阶段。 在作业级别,使其仅可用于特定作业。 当一个变量在 YAML 的顶部定义时,它将可用于管道中的所有作业和阶段,并且是一个全局变量。 YAML 中定义的全局变量在管道设置 UI 中不可见。

    参考:https://docs.microsoft.com/en-us/azure/devops/pipelines/process/variables?view=azure-devops&tabs=yaml%2Cbatch#variable-scopes

    天蓝色管道.yml

    trigger:
      - none
    
    parameters:
      - name: parA
        type: string
        default: "A"
      - name: parB
        type: string
        default: "B"
    
    variables:
      parA : ${{ parameters.parA }}
      parB : ${{ parameters.parB }}
    
    steps:
      - template: temp1.yml
      - template: temp2.yml
    

    temp1.yml → 第一个模板

    steps:
      - bash: echo $(parA)
        displayName: 'Template 1'
    

    temp2.​​yml → 第二个模板

    steps:
      - bash: echo $(parB)
        displayName: 'Template 2'
    

    结果:

    模板 1:

    模板 2:

    【讨论】:

    • 谢谢 如果我可以指定一个 ui 变量“环境”,然后在排队时解析该变量,那将非常有用。我尝试了以下方法,但它给出了“意外值”变量: - 模板:$(environment).yaml - 模板:${{ variables.environment }}.yaml
    • 这看起来有点困难,因为模板名称是在编译时解析的,而变量是在运行时解析的
    • @MartinNilsson:我已经用另一个场景更新了解决方案
    • 谢谢。这是我目前的解决方案,但我希望删除该参数
    • 使用上述解决方案,您将能够删除重复的参数。
    【解决方案2】:

    有一种方法可以消除对两个 parameters/variables 的需要

    我实际上建议仅将参数文件加载为包含任务的作业的一部分。这种方式可以完全模板化并将参数文件限定在作业范围内,更不用说如果需要并行代理的好处了。

    它可能看起来像:

    parameters:
    - name: environmentObject
      type: object
      default: ['A','B']
    jobs: 
    - ${{ each environmentObject in parameters.environmentObjects }} :
        - template: echo.yml
          parameters: 
               environmentName: ${{ evnrionmentObject }}
    

    echo.yml

    parameters
    - name: environmenName
      type: string
      default: ''
    
    jobs:
    - job: bash_${{parameters.environmentName}}
      steps:
          - bash: echo ${{parameters.environmentName}}
            displayName: 'Template ${{parameters.environmentName}}'
    

    【讨论】:

    • 谢谢!这对于在单个管道中将多个环境部署为单独的阶段非常有用。我最初的想法是从同一个 yaml 为每个环境创建单独的管道,但是定义一个在队列时解析的隐藏属性/变量被证明是困难的。
    猜你喜欢
    • 1970-01-01
    • 2014-07-15
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多