You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 12:09:01