在 Azure DevOps 中,我尝试创建一个管道,为运行它的用户提供简单的预设选项选择。这些选项将转换为模板化阶段指定的不同参数组合(其定义,我无法控制)。我的管道的想法是,经常使用的构建配置很容易正确选择,而不必手动设置 3 或 4 个不同的参数。
我需要 immutable_pipeline 中的“Build.Setup”在选择第一个无线电时打印 config_one, profile_one
(buildType=type1),当 buildType=type2 时打印 config_two, profile_two
,依此类推。
不幸的是,除了默认值之外,我真的很难将任何变量值放入模板化阶段。 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 }}
templates/immutable_pipeline.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 }}'
答案 0 :(得分:0)
我刚刚找到了一个使用 ${{ 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
仍然对设置变量的原始方法是否可行感兴趣,如果只是因为我花了很多时间。