首页 > 解决方案 > AzureDevops 根据参数设置变量并在下一阶段传递给模板

问题描述

在 Azure DevOps 中,我正在尝试创建一个管道,它为运行它的用户提供简单的预设选项选择。这些选项将转换为模板化阶段指定的不同参数组合(我无法控制其定义)。我的管道的想法是,经常使用的构建配置很容易正确选择,而不必手动设置 3 或 4 个不同的参数。

我需要 immutable_pipeline 中的“Build.Setup”config_one, profile_one在选择第一个无线电(buildType=type1)、config_two, profile_twobuildType=type2 等时打印。

不幸的是,除了默认值之外,我真的很难将任何变量值放入模板化阶段。ADO 变量甚至是可变变量 - 还是只是常量?我已广泛阅读 MS 文档并了解不同宏声明类型的含义。我尝试了许多不同的语法组合${{...}}$(...)而且$[...],它们的行为都不同,但似乎没有一个能够提供所需的内容。这甚至可能吗?有人可以建议一个简单的解决方案吗?

管道:

name: $(Date:yyyyMMdd).$(Rev:r)

parameters:
  - name: buildType
    displayName: 'Type of build'
    type: string
    default: 'type3'
    values: ['type1', 'type2', 'type3']

pool:
  name: default

variables:
  - name: config
    value: 'defaultConfig'
  - name: profile
    value: 'defaultProfile'

stages:
  - stage: Stage1
    displayName: Prepare build config

    jobs:
      - job: Job1_1
        steps:
          - checkout: none
          - task: Bash@3
            name: SetVariables
            inputs:
              targetType: inline
              script: |
                p1='${{ parameters.buildType }}'
                v1='$(config)'
                v2='$(profile)'
                echo -e "BEFORE: p1='${p1}'\n    v1='${v1}'\n    v2='${v2}'"
                case ${p1} in
                  type1)
                    v1='config_one'
                    v2='profile_one'
                    ;;
                  type2)
                    v1='config_two'
                    v2='profile_two'
                    ;;
                  type3)
                    v1='config_three'
                    v2='profile_three'
                    ;;
                esac
                echo -e "AFTER: p1='${p1}'\n    v1='${v1}'\n    v2='${v2}'"
                echo "##vso[task.setvariable variable=config]${v1}"
                echo "##vso[task.setvariable variable=profile;isOutput=True]${v2}"

      - job: Job1_2
        dependsOn: Job1_1
        variables:
          - name: variable1
            value: $(config)
          - name: variable2
            value: $[ dependencies.Job1_1.outputs['SetVariables.profile']]
        steps:
          - task: Bash@3
            name: GetVariables2
            inputs:
              targetType: inline
              script: |
                echo -e 'SAME STAGE: v1="$(variable1)"\n    v2="$(variable2)"'

    # Next stage - use computed values for "config" and "profile"
  - template: templates/immutable_pipeline.yml
    parameters:
      config: $(config)
      profile: ${{ variables.profile }}

模板/不可变管道.yml:

请注意,我无权更改它,我无法做到dependsOn: Stage1.Job1_1


parameters:
  - name: config
    displayName: 'Config'
    type: string
    default: 'unset'
  - name: profile
    displayName: 'Profile'
    type: string
    default: 'unset'

stages:
  - stage: Build
    displayName: Templated build
    jobs:
      - job: Setup
        pool:
          name: default
          demands:
            - Agent.OS -equals Linux
        steps:
          - checkout: none
          - script: |
              echo '##[info] parameters.config=${{ parameters.config }}'
              echo '##[info] parameters.profile=${{ parameters.profile }}'

标签: azure-devopsazure-pipelines

解决方案


${{ if eq(...) }}:我刚刚找到了一个使用以下语法的解决方案(可以说比使用变量更简单) :

name: $(Date:yyyyMMdd).$(Rev:r)

parameters:
  - name: buildType
    displayName: 'Type of build'
    type: string
    default: 'type3'
    values: ['type1', 'type2', 'type3']

pool:
  name: default

stages:
  - template: templates/immutable_pipeline.yml
    ${{ if eq(parameters.buildType, 'type1') }}:
      parameters:
        config: config_one
        profile: profile_one
    ${{ if eq(parameters.buildType, 'type2') }}:
      parameters:
        config: config_two
        profile: profile_two
    ${{ if eq(parameters.buildType, 'type3') }}:
      parameters:
        config: config_three
        profile: profile_three

仍然对设置变量的原始方法是否可能感兴趣,如果只是因为我花了这么多时间在它上面。


推荐阅读