You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gitlab CI中如何正确实现变量的嵌套引用?

解决Gitlab CI中动态引用dotenv变量的问题

你遇到的是Gitlab CI变量解析顺序与Shell变量展开的冲突问题。直接用$LIST_${PROJECT_NAME}无法正确获取值,是因为Gitlab会先对CI配置里的变量做一层替换,之后Shell才处理剩下的变量,导致嵌套变量没有被正确解析。

以下是两种可行的解决方法:

方法1:使用Bash的间接引用(推荐)

Bash支持${!VAR_NAME}语法实现间接变量引用——先把动态拼接的变量名存到临时变量里,再用该语法获取对应的值。

修改你的.final-template脚本部分:

.final-template: &final-template
  image: ubuntu
  stage: finish
  script:
    - echo "Run final jobs"
    - echo $LIST_ProjectA  # works
    - echo $LIST_ProjectB  # works 
    # 先拼接目标变量名
    - TARGET_VAR="LIST_${PROJECT_NAME}"
    # 用间接引用获取对应变量的值
    - echo ${!TARGET_VAR}  # 现在能正确输出对应内容
    - VAR1=${!TARGET_VAR}
    - echo $VAR1  # 可拿到正确的列表值
  tags: [ k8s,mn-bw-krun01 ]

方法2:使用eval(不推荐,存在安全风险)

如果你的场景允许使用eval,可以通过它强制Shell重新解析变量:

.final-template: &final-template
  image: ubuntu
  stage: finish
  script:
    - echo "Run final jobs"
    - echo $LIST_ProjectA  # works
    - echo $LIST_ProjectB  # works 
    - VAR1=$(eval echo \$LIST_${PROJECT_NAME})
    - echo $VAR1  # 能正确获取值
  tags: [ k8s,mn-bw-krun01 ]

⚠️ 注意:eval会执行传入的任意命令,若PROJECT_NAME的值不可控,可能带来安全风险,因此优先使用方法1。

原写法失效的原因

Gitlab CI的变量替换在脚本发送给Runner执行前完成。当你写$LIST_${PROJECT_NAME}时,Gitlab会先把${PROJECT_NAME}替换成ProjectA或ProjectB,最终Shell拿到的是$LIST_ProjectA。但受dotenv变量传递机制影响,Shell可能无法正确识别该变量为可展开的环境变量,导致直接展开失败。而间接引用或eval是让Shell在运行时主动解析拼接后的变量名,从而拿到正确的值。

内容的提问来源于stack exchange,提问作者Mikhail_Sam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 16:45:44