如何在Azure DevOps YAML管道中遍历用户自定义变量?
问题原因
你当前使用的 ${{ each }} 是编译时模板表达式,仅能识别在YAML文件中定义的变量、以及系统预定义的编译时变量。通过Azure DevOps UI创建的用户自定义变量属于运行时变量,在编译阶段还未被注入到变量上下文,因此无法被编译时表达式遍历到。
可行解决方案
方案1:运行时通过环境变量遍历(推荐)
所有运行时变量(包括UI定义的自定义变量)在任务执行阶段都会自动注入到任务的环境变量中,直接通过shell脚本读取环境变量即可,不需要依赖编译时表达式。
替换原有steps段代码如下:
steps: - script: | # 打印所有环境变量,UI定义的自定义变量也会在输出列表中 env # 如需过滤系统变量,仅保留自定义变量,可添加过滤规则,示例如下: echo "===== 过滤后的自定义变量 =====" env | grep -vE "^(SYSTEM_|BUILD_|AGENT_|RELEASE_|TASK_)" displayName: 遍历所有运行时变量(含UI自定义变量)
注意:标记为保密的UI变量不会明文出现在输出中,Azure DevOps会自动对保密变量的值做掩码处理。
方案2:显式声明UI变量到YAML变量上下文
如果需要在编译时逻辑中使用UI自定义变量,可以在YAML的variables段显式引用UI变量,声明后即可被 ${{ each }} 识别:
# 顶部variables段显式声明UI中定义的自定义变量,值留空即可,运行时会自动读取UI配置的数值 variables: 你的UI自定义变量名1: 你的UI自定义变量名2: # 后续stages、job逻辑保持不变,原有${{ each }}遍历逻辑即可识别上述声明的变量
该方案的局限性是需要提前知晓UI变量的名称,无法动态适配后续新增的UI变量。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

