GitLab CI如何用Bash动态生成artifacts的paths路径配置
问题根因
YAML 锚点的解析发生在 GitLab 流水线初始化的 YAML 预处理阶段,而你定义的 Bash 脚本是 Job 运行阶段才会执行的代码。你直接把 Bash 脚本锚点塞到 artifacts.paths 里,GitLab Runner 会把整个脚本的完整字符串当成单个文件路径去查找,自然会报找不到文件的错误。
可行解决方案
提供两种可落地的实现方式,按需选择:
方案1:YAML锚点+路径自动忽略(最适配你的锚点复用需求,实现简单)
GitLab 本身支持 artifacts.paths 自动忽略不存在的路径,只会抛出警告不会打断流水线,你可以直接把两种模块的路径都预定义为锚点,直接引用即可:
# 提前定义通用路径锚点 .module_artifact_paths: &module_artifact_paths - ${CI_PROJECT_DIR}/${MODULE_FIRST}/target/surefire-reports/ - ${CI_PROJECT_DIR}/${MODULE_FIRST}/target/site/jacoco/index.html - ${CI_PROJECT_DIR}/${MODULE_SECOND}/target/surefire-reports/ - ${CI_PROJECT_DIR}/${MODULE_SECOND}/target/site/jacoco/index.html unit_test: stage: test image: $MAVEN_IMAGE script: - *tests_variables_export - mvn ${MAVEN_CLI_OPTS} clean test - | if [ "${MODULE_FIRST}" != "UNKNOWN" ]; then cat ${CI_PROJECT_DIR}/${MODULE_FIRST}/target/site/jacoco/index.html fi - | if [ "${MODULE_SECOND}" != "UNKNOWN" ]; then cat ${CI_PROJECT_DIR}/${MODULE_SECOND}/target/site/jacoco/index.html fi artifacts: expose_as: 'code coverage' paths: *module_artifact_paths
方案2:动态归集文件到固定目录(适合模块数量不固定的场景)
如果后续模块数量可能扩展,可以在脚本阶段把需要归档的文件统一拷贝到固定临时目录,直接归档整个目录即可:
unit_test: stage: test image: $MAVEN_IMAGE script: - *tests_variables_export - mvn ${MAVEN_CLI_OPTS} clean test # 新建统一归档目录 - mkdir -p ./coverage-exports # 按变量判断拷贝需要的文件 - | if [ "${MODULE_FIRST}" != "UNKNOWN" ]; then cat ${CI_PROJECT_DIR}/${MODULE_FIRST}/target/site/jacoco/index.html mkdir -p ./coverage-exports/${MODULE_FIRST} cp -r ${CI_PROJECT_DIR}/${MODULE_FIRST}/target/surefire-reports/ ./coverage-exports/${MODULE_FIRST}/ cp ${CI_PROJECT_DIR}/${MODULE_FIRST}/target/site/jacoco/index.html ./coverage-exports/${MODULE_FIRST}/jacoco.html fi - | if [ "${MODULE_SECOND}" != "UNKNOWN" ]; then cat ${CI_PROJECT_DIR}/${MODULE_SECOND}/target/site/jacoco/index.html mkdir -p ./coverage-exports/${MODULE_SECOND} cp -r ${CI_PROJECT_DIR}/${MODULE_SECOND}/target/surefire-reports/ ./coverage-exports/${MODULE_SECOND}/ cp ${CI_PROJECT_DIR}/${MODULE_SECOND}/target/site/jacoco/index.html ./coverage-exports/${MODULE_SECOND}/jacoco.html fi artifacts: expose_as: 'code coverage' paths: - ./coverage-exports/
内容的提问来源于stack exchange,提问作者SiMa
相关产品推荐
相关产品推荐

