GitLab CI:子项目变量未覆盖父项目变量导致URL值为空问题
问题原因
GitLab CI 中,include 会先加载父项目的内容,再处理子项目代码。父项目里的 deploy-dev job 在解析时,会将 <<: *dev_vars 展开为父项目定义的空对象 {}。后续子项目重新定义同名锚点 &dev_vars,但已经展开的 job 内容不会被更新,因此 URL 变量为空。
解决方法
方法一:子项目重写 deploy-dev job
在子项目中重新定义 deploy-dev job,引用子项目的锚点,覆盖父项目的同名 job:
include: - project: 'ci-parent' ref: 'main' file: - my-gitlab-ci.yml .dev_vars: &dev_vars URL: http://my-dev_url # 重写父项目的deploy-dev job,使用子项目的锚点 deploy-dev: variables: <<: *dev_vars script: - echo "URL=$URL"
方法二:父项目改用 extends 继承模板
调整父项目结构,让 job 通过 extends 引用模板,子项目可扩展模板变量:
父项目文件修改:
.dev_vars: &dev_vars {} deploy-dev: extends: .dev_vars script: - echo "URL=$URL"
子项目文件修改:
include: - project: 'ci-parent' ref: 'main' file: - my-gitlab-ci.yml # 扩展父项目的.dev_vars模板,添加URL变量 .dev_vars: extends: .dev_vars variables: URL: http://my-dev_url
方法三:直接定义全局变量(无需锚点)
如果不需要复用锚点结构,子项目直接定义全局变量即可:
父项目文件修改:
deploy-dev: script: - echo "URL=$URL"
子项目文件修改:
include: - project: 'ci-parent' ref: 'main' file: - my-gitlab-ci.yml variables: URL: http://my-dev_url
内容的提问来源于stack exchange,提问作者Tyvain
相关产品推荐
相关产品推荐

