如何在GitLab CI/CD中自定义JUnit报告路径并解决工件上传错误
解决GitLab CI工件上传路径不匹配问题
问题根源
Docker容器内生成的Jacoco报告路径为/proj-name/java/target,但GitLab CI的工作目录是/builds/pkg-name/proj-name(对应环境变量$CI_PROJECT_DIR),两者路径未关联,导致CI无法找到容器内生成的报告文件。
解决方案
方案1:挂载CI工作目录到Docker容器(推荐)
修改build_unit_test.sh中的Docker运行命令,将CI项目的java目录挂载到容器内的/proj-name/java路径,让Maven生成的报告直接写入CI工作目录:
# 替换原docker run命令为以下内容 docker run -v "$CI_PROJECT_DIR/java:/proj-name/java" <你的镜像名称> sh -c "mvn clean install && mvn jacoco:report"
然后在gitlab-ci.yml的test作业中,指定正确的工件路径:
test: stage: test script: - ./build_unit_test.sh artifacts: paths: - java/target/**/* # 对应挂载后CI工作目录下的路径 expire_in: 1 week
方案2:从Docker容器拷贝报告到CI工作目录
如果无法修改挂载配置,可在脚本中执行完Docker命令后,将容器内的报告拷贝到CI工作目录:
# 运行容器并生成报告,给容器命名方便后续操作 docker run --name test-job-container <你的镜像名称> sh -c "mvn clean install && mvn jacoco:report" # 拷贝容器内的报告目录到CI工作目录 docker cp test-job-container:/proj-name/java/target "$CI_PROJECT_DIR/java/" # 清理容器 docker rm test-job-container
对应的gitlab-ci.yml工件配置和方案1一致。
方案3:调整Dockerfile的工作目录
修改Dockerfile,将工作目录设置为容器内的报告父目录,配合挂载实现路径对齐:
# 在Dockerfile中添加以下行 WORKDIR /proj-name/java
然后在build_unit_test.sh中使用挂载命令:
docker run -v "$CI_PROJECT_DIR/java:/proj-name/java" <你的镜像名称> sh -c "mvn clean install && mvn jacoco:report"
这样Maven会直接在挂载的目录下生成target文件夹,CI可直接读取。
验证
执行CI作业后,检查java/target目录是否出现在CI工作目录中,若存在则工件会正常上传,可在GitLab作业页面的“工件”标签下浏览下载。
内容的提问来源于stack exchange,提问作者Meenal
相关产品推荐
相关产品推荐

