JaCoCo 覆盖率报告

  • Tier: 基础版, 专业版, 旗舰版
  • Offering: JihuLab.com, 私有化部署
History
    • 引入于极狐GitLab 17.3,使用名为 jacoco_coverage_reports功能标志。默认禁用。
    • 在极狐GitLab 17.6 中 GA。功能标志 jacoco_coverage_reports 被移除。

为了让 JaCoCo 覆盖率报告正常工作,你必须生成一个格式正确的 JaCoCo XML 文件,该文件提供行覆盖率。

JaCoCo 覆盖率报告可视化支持:

  • 指令 (C0 覆盖率),报告中的 ci(被覆盖的指令)。

添加 JaCoCo 覆盖率任务#

要配置你的流水线以生成覆盖率报告,请在你的 .gitlab-ci.yml 文件中添加一个任务。例如:

下面是一个示例配置:

yaml
1test-jdk11: 2 stage: test 3 image: maven:3.6.3-jdk-11 4 script: 5 - mvn $MAVEN_CLI_OPTS clean org.jacoco:jacoco-maven-plugin:prepare-agent test jacoco:report 6 artifacts: 7 reports: 8 coverage_report: 9 coverage_format: jacoco 10 path: target/site/jacoco/jacoco.xml

在这个示例中,mvn 命令生成 JaCoCo 覆盖率报告。path 指向生成的报告。

如果任务生成多个报告,在产物路径中使用通配符

修正相对文件路径#

文件路径转换#

JaCoCo 报告提供相对文件路径,但覆盖率报告可视化需要绝对路径。极狐GitLab 会尝试使用相关合并请求中的数据将相对路径转换为绝对路径。

路径匹配过程如下:

  1. 找到与同一流水线引用相关的所有合并请求。
  2. 对于所有更改的文件,找到所有的绝对路径。
  3. 对于报告中的每个相对路径,使用第一个匹配的绝对路径。

这个过程可能无法始终找到合适的匹配绝对路径。

多个模块或源目录#

对于多个模块或源目录的相同文件名,默认情况下可能无法找到绝对路径。

例如,如果这些文件在一个合并请求中发生更改,极狐GitLab 无法找到绝对路径:

  • src/main/java/org/acme/DemoExample.java
  • src/main/other-module/org/acme/DemoExample.java

为了成功进行路径转换,你必须在相对路径中有一些独特的差异。例如,你可以更改其中一个文件或目录名:

  • 更改文件名:

    diff
    src/main/java/org/acme/DemoExample.java - src/main/other-module/org/acme/DemoExample.java + src/main/other-module/org/acme/OtherDemoExample.java
  • 更改路径:

    diff
    src/main/java/org/acme/DemoExample.java - src/main/other-module/org/acme/DemoExample.java + src/main/other-module/org/other-acme/DemoExample.java

你还可以添加一个新目录,只要完整的相对路径是唯一的。

故障排除#

并非所有更改文件的指标都显示#

如果你从相同的源分支创建了一个新的合并请求,但目标分支不同,指标可能无法正确显示。

该任务不会考虑新的合并请求中的差异,也不会显示不在其他合并请求差异中的文件的任何指标。即使生成的覆盖率报告中包含指定文件的指标,也会发生这种情况。

要解决此问题,请等到创建新的合并请求后,再重新运行你的流水线或启动一个新的流水线。然后会考虑新的合并请求。