GitLab CI中$CI_ENVIRONMENT_SLUG变量为空问题求助
问题根源分析
其实这个问题我之前帮不少人解决过——核心原因是GitLab CI的环境变量有作用域限制:CI_ENVIRONMENT_SLUG以及其他CI_ENVIRONMENT_*前缀的变量,属于环境专属变量。只有当你的job明确通过environment配置项关联到某个具体的部署环境时,GitLab才会自动为这个job注入这些变量。
你的部署阶段job肯定配置了environment字段,所以能拿到有效值;但Tests阶段的job没有这个配置,自然就无法获取到CI_ENVIRONMENT_SLUG,输出为空也就不奇怪了。
两种可行解决方案
方案一:给Tests job绑定对应环境
如果你的测试是专门针对某个部署后的环境运行的,最直接的办法就是给Tests job加上environment配置,和部署阶段的环境保持一致。这样GitLab会自动把对应环境的CI_ENVIRONMENT_SLUG注入进来:
Tests: image: maven:3.5.0-jdk-8 stage: Tests and static code checks # 新增environment配置,和部署阶段的环境名称匹配 environment: name: your-deployment-environment-name # 替换成你部署阶段用的环境名 url: http://$CI_ENVIRONMENT_SLUG-publish.test.com # 可选,也可以在这里定义环境访问URL variables: QA_PUBLISH_URL: http://$CI_ENVIRONMENT_SLUG-publish.test.com script: - echo $QA_PUBLISH_URL - echo $CI_ENVIRONMENT_SLUG # 现在应该能输出有效值了 - mvn clean -D...
方案二:通过Artifacts传递变量
如果你的Tests job是通用测试,不需要绑定到特定环境,但需要复用部署阶段的CI_ENVIRONMENT_SLUG,可以在部署阶段把变量保存到文件,通过artifacts传递给Tests阶段:
第一步:修改部署阶段job,保存变量到文件
Deploy: stage: deploy environment: name: your-deployment-environment-name script: # 把环境变量写入文件 - echo "CI_ENVIRONMENT_SLUG=$CI_ENVIRONMENT_SLUG" > environment_vars.txt # 把文件作为artifacts上传,供后续阶段使用 artifacts: paths: - environment_vars.txt
第二步:修改Tests阶段job,加载传递的变量
Tests: image: maven:3.5.0-jdk-8 stage: Tests and static code checks # 依赖部署阶段的artifacts,确保能拿到environment_vars.txt dependencies: - Deploy script: # 加载文件里的变量 - source environment_vars.txt # 定义QA_PUBLISH_URL(也可以直接在script里用变量) - export QA_PUBLISH_URL=http://$CI_ENVIRONMENT_SLUG-publish.test.com - echo $QA_PUBLISH_URL - echo $CI_ENVIRONMENT_SLUG - mvn clean -D...
额外提示
如果部署和测试不在同一个pipeline里,方案二的artifacts就没法复用了。这时候可以考虑:
- 在GitLab项目的Settings > CI/CD > Variables里手动设置一个环境变量,比如
DEPLOY_ENV_SLUG,然后在两个阶段都用这个变量 - 或者用GitLab API把部署阶段的变量存储到项目变量中,但这种方式相对复杂,一般不推荐。
内容的提问来源于stack exchange,提问作者Tim Schwalbe
相关产品推荐
相关产品推荐

