GitLab-CI中如何不传递全量制品即可在不同任务间传递变量
GitLab CI跨Job仅传递环境变量不拉取多余制品的解决方案
你当前配置的矛盾点在于:
- dotenv报告的变量由GitLab后台直接解析注入,本身不需要拉取实体制品文件就能生效,但只要你在
needs中开启了artifacts: true,GitLab默认会拉取该Job所有在paths中声明的制品,也就是你体积很大的app文件夹 - 你没有把
build.env加入artifacts.paths,所以拉取制品时自然不会包含这个文件,只有GitLab解析好的变量会被注入到后续Job环境中
方案1:直接禁用制品下载(最简便,无需修改上游Job配置)
通过dependencies参数禁止下载任何上游制品文件,dotenv解析出的变量依然会被GitLab正常注入:
buildTest: stage: build artifacts: reports: dotenv: build.env name: "FullRelease" paths: - 'app' expire_in: 1 day script: | echo "version=1.2.3" >> build.env .... runWin: stage: runOnWin variables: GIT_STRATEGY: none script: | echo "Version is %version%" needs: - job: buildTest artifacts: true # 保持true让GitLab处理dotenv报告 dependencies: [] # 禁止下载任何上游制品,不会拉取体积大的app文件夹
方案2:指定拉取制品路径(GitLab 15.7及以上版本适用)
如果你需要保留build.env实体文件,不想拆分Job,可以在needs中指定仅拉取dotenv文件:
buildTest: stage: build artifacts: reports: dotenv: build.env name: "FullRelease" paths: - 'app' - 'build.env' # 需将build.env加入制品路径才能指定拉取 expire_in: 1 day script: | echo "version=1.2.3" >> build.env .... runWin: stage: runOnWin variables: GIT_STRATEGY: none script: | echo "Version is %version%" # 此处可拿到实体的build.env文件 needs: - job: buildTest artifacts: paths: - build.env # 仅拉取build.env,不会下载整个app文件夹
方案3:拆分Job(兼容性最佳,全版本可用)
如果你的app制品只有少数Job需要,绝大多数Job只需要变量,建议把生成变量和构建应用的逻辑拆分为两个独立Job,各自管理制品:
# 专门生成环境变量的Job,仅上传dotenv,无大体积制品 generateEnv: stage: build artifacts: reports: dotenv: build.env expire_in: 1 day script: | echo "version=1.2.3" >> build.env # 专门构建应用的Job,仅上传app制品 buildTest: stage: build artifacts: name: "FullRelease" paths: - 'app' expire_in: 1 day script: # 原有构建app的逻辑 .... runWin: stage: runOnWin variables: GIT_STRATEGY: none script: | echo "Version is %version%" needs: - job: generateEnv artifacts: true # 仅拉取极小的build.env,不会涉及app文件夹
后续需要app制品的Job单独依赖buildTest即可,没有多余的文件传输开销。
内容的提问来源于stack exchange,提问作者Tadeusz
相关产品推荐
相关产品推荐

