如何从env文件读取值并设置为GitLab pipeline流水线变量
问题原因
你原来的方案不生效有两个核心原因:
- GitLab CI的
only/rules:variables条件是在流水线初始化、job创建阶段就完成评估的,这时候还没有调度runner执行before_script里的命令,你通过source加载的变量只存在于当前job运行时的shell会话中,既无法反向影响之前就完成的job触发条件判断,也不会默认成为全局流水线变量。 - 你写的变量匹配规则大小写不匹配:
test.env里定义的SAMPLE值是小写的"true",而你only:variables里写的判断条件是$SAMPLE == 'True',大小写不一致也会导致匹配失败。
解决方案
使用GitLab CI自带的dotenv报告功能即可实现从文件加载变量、传递到后续job的需求,这也是官方推荐的跨job传递变量的方案,配置示例如下:
stages: - prepare # 新增前置stage,专门用来加载env变量 - publish # 加载env文件的前置job load_env_vars: stage: prepare script: # 替换为你实际拉取test.env文件的命令,原写法git clone test.env不符合语法,需要补全仓库地址 - git clone https://<你的仓库域名>/<env仓库名>.git - cat <env仓库名>/test.env >> build.env # 将env文件内容导出到build.env artifacts: reports: dotenv: build.env # 声明为dotenv类型产物,GitLab会自动将文件内的变量注入到后续所有stage的job中 test: stage: publish needs: [load_env_vars] # 显式依赖前置job的产物,确保能拿到变量 trigger: project: test_pipeline branch: master strategy: depend # 如果你需要把变量传递给触发的子流水线,可以加上variables配置 variables: SAMPLE: $SAMPLE rules: - if: $SAMPLE == "true" # 注意和env文件里的变量值保持大小写完全一致
额外说明
- 如果你的
test.env里有多个变量,不需要额外修改配置,dotenv会自动加载文件内所有符合KEY=VALUE格式的变量。 - 不要在
test.env里写除了变量定义之外的其他shell命令,否则会导致dotenv解析失败。
内容的提问来源于stack exchange,提问作者Sourabh
相关产品推荐
相关产品推荐

