如何利用$(Build.DefinitionName)动态获取流水线对应环境变量值
动态获取流水线对应环境变量的解决方案
我们正尝试集中管理环境变量,流水线名称为"mytap-test",现有模板文件如下:
vars.yaml 模板
variables: - name: mytap-test value: 22
原始 pipeline.yaml 模板
trigger: none resources: repositories: - repository: Templates type: git name: DevSecOps/DevSecOps variables: - template: UTAP/Library/vars.yaml@Templates stages: - stage: pull_image pool: name: LinuxJavaCIBuildAgents jobs: - job: pull_image workspace: clean: all steps: - script: | echo "##vso[task.setvariable variable=docker_version;]$(mytap-test)" echo ${docker_version} displayName: get version
需求是:不再依赖静态变量名$(mytap-test),而是通过$(Build.DefinitionName)获取流水线名称,动态匹配vars.yaml中对应变量的值,最终让echo ${docker_version}返回22。
解决方案
利用Bash的变量间接引用语法${!var_name}实现动态取值,修改pipeline.yaml中的script步骤即可:
修改后的 pipeline.yaml(核心部分)
stages: - stage: pull_image pool: name: LinuxJavaCIBuildAgents jobs: - job: pull_image workspace: clean: all steps: - script: | # 捕获流水线名称 PIPELINE_NAME=$(Build.DefinitionName) # 间接引用对应流水线的变量值 VERSION_VALUE=${!PIPELINE_NAME} # 设置docker_version变量 echo "##vso[task.setvariable variable=docker_version;]$VERSION_VALUE" # 验证输出 echo ${docker_version} displayName: get version
原理说明
PIPELINE_NAME=$(Build.DefinitionName):将当前流水线名称(如"mytap-test")赋值给本地变量PIPELINE_NAME;${!PIPELINE_NAME}:Bash的间接引用语法,会把PIPELINE_NAME的取值(即"mytap-test")当作变量名,取出对应的值(也就是vars.yaml中定义的22);- 后续步骤和原始逻辑一致,将获取到的版本值赋值给
docker_version并验证输出。
内容的提问来源于stack exchange,提问作者vinilka8
相关产品推荐
相关产品推荐

