GitLab CI从文件预加载变量:路径变量不生效的解决方案咨询
解决GitLab CI中artifacts无法读取运行时变量的问题
问题根源
GitLab CI的作业配置(包括artifacts.paths)是由Runner在作业启动前就完成解析的,而before_script或script中定义的变量属于作业运行时的环境变量,无法回溯影响提前解析的配置项,因此直接在artifacts.paths中引用这些变量会失效。
解决方案1:复制文件到固定路径(兼容所有GitLab版本)
在script中先将需要归档的文件复制到一个固定目录,然后让artifacts指向这个固定目录,避开动态变量的问题:
build-hw: stage: build when: on_success timeout: 10 hours before_script: - source /usr/local/bin/setup_env.sh - set -o allexport; source .env; set +o allexport script: - make build - make export_hw sw/$SW_PRJ/xsa # 创建固定归档目录并复制文件 - mkdir -p artifacts/hw artifacts/xsa - cp $HW_PRJ/$HW_PRJ.runs/*.log artifacts/hw/ - cp $HW_PRJ/$HW_PRJ.runs/impl_1/top.bit artifacts/hw/ - cp $HW_PRJ/$HW_PRJ.runs/impl_1/top.ltx artifacts/hw/ - cp sw/$SW_PRJ/xsa/top.xsa artifacts/xsa/ artifacts: name: "$CI_JOB_NAME-$CI_COMMIT_REF_NAME-$CI_COMMIT_SHORT_SHA" expire_in: 1 hour paths: - artifacts/
解决方案2:使用paths_from动态指定路径(GitLab 16.0+)
如果你的GitLab版本在16.0及以上,可以利用artifacts.paths_from特性,在script中动态生成包含归档路径的文件,让artifacts读取这个文件的内容:
build-hw: stage: build when: on_success timeout: 10 hours before_script: - source /usr/local/bin/setup_env.sh - set -o allexport; source .env; set +o allexport script: - make build - make export_hw sw/$SW_PRJ/xsa # 生成包含归档路径的文件 - > cat > artifact_paths.txt << EOF $HW_PRJ/$HW_PRJ.runs/*.log $HW_PRJ/$HW_PRJ.runs/impl_1/top.bit $HW_PRJ/$HW_PRJ.runs/impl_1/top.ltx sw/$SW_PRJ/xsa/top.xsa EOF artifacts: name: "$CI_JOB_NAME-$CI_COMMIT_REF_NAME-$CI_COMMIT_SHORT_SHA" expire_in: 1 hour paths_from: - artifact_paths.txt
补充说明
如果需要在多个作业中复用这些变量,还可以将.env文件的内容配置为项目/组级CI/CD变量,这样所有作业的配置阶段都能直接读取到变量值,无需在before_script中导入。
内容的提问来源于stack exchange,提问作者Ezk13
相关产品推荐
相关产品推荐

