azure-devops - AzureDevops 根据参数设置变量并在下一阶段传递给模板
问题描述
在 Azure DevOps 中,我正在尝试创建一个管道,它为运行它的用户提供简单的预设选项选择。这些选项将转换为模板化阶段指定的不同参数组合(我无法控制其定义)。我的管道的想法是,经常使用的构建配置很容易正确选择,而不必手动设置 3 或 4 个不同的参数。
我需要 immutable_pipeline 中的“Build.Setup”config_one, profile_one
在选择第一个无线电(buildType=type1)、config_two, profile_two
buildType=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 }}'
解决方案
${{ 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
仍然对设置变量的原始方法是否可能感兴趣,如果只是因为我花了这么多时间在它上面。
推荐阅读
- stm32 - What initialises the contents of the STM32's USB BTABLE when the __HAL_RCC_USB_CLK_ENABLE() macro is executed in HAL_PCD_MspInit()?
- java - 未报告的异常 ParseException; 必须被捕获或声明被抛出 -- JAVA 错误
- java - 是否可以在 logback 中为特定的 appender/logger 禁用 MDC 日志记录字段?
- visual-studio - Visual Studio:(如何)我可以签入变更集中的特定行,而不是简单地签入整个文件?
- python - Python中的字典输出为字符串
- java - XML 中的空标签导致我的解析器出现问题
- php - 运行迁移后出现 EndyJasmi\Cuid::random() 错误
- openlayers - 获取要素样式属性 - openlayers
- php - Symfony 在哪里初始化 Doctrine 的默认事务隔离级别?
- node.js - 我的 webpack 配置中的错误/缺少加载程序引用在哪里?