Maven 使用gitlab-ci.yml文件的代码覆盖率报告

Maven 使用gitlab-ci.yml文件的代码覆盖率报告,maven,gitlab,code-coverage,gitlab-ci,jacoco,Maven,Gitlab,Code Coverage,Gitlab Ci,Jacoco,我需要在Gitlab中查看java maven项目的代码覆盖率报告。 根据和其他一些来源: 我将jacoco添加到pom.xml中的插件列表中 将页面作业添加到我的.gitlab ci.yml文件中 将Total.*([0-9]{1,3})%添加到项目设置中的代码覆盖率分析中 但是没有任何报道,或者至少我看不到。没有覆盖率百分比或覆盖率报告页 .gitlab ci.yml文件的内容: image: maven:latest variables: MAVEN_CLI_OPTS: "

我需要在Gitlab中查看java maven项目的代码覆盖率报告。 根据和其他一些来源:

  • 我将
    jacoco
    添加到
    pom.xml
    中的插件列表中
  • 将页面作业添加到我的
    .gitlab ci.yml
    文件中
  • Total.*([0-9]{1,3})%
    添加到项目设置中的代码覆盖率分析中
  • 但是没有任何报道,或者至少我看不到。没有覆盖率百分比或覆盖率报告页

    .gitlab ci.yml
    文件的内容:

    image: maven:latest
    
    variables:
      MAVEN_CLI_OPTS: "--batch-mode --errors --fail-at-end --show-version -DinstallAtEnd=true -DdeployAtEnd=true"
      MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=WARN -Dorg.slf4j.simpleLogger.showDateTime=true -Djava.awt.headless=true"
    
    cache:
      paths:
        - .m2/repository/
    
    build:
      stage: build
      script:
        - mvn $MAVEN_CLI_OPTS compile
    
    test:
      stage: test
      script:
        - mvn $MAVEN_CLI_OPTS test
      artifacts:
        paths:
          - target/site/jacoco/
    pages:
      stage: deploy
      dependencies:
        - test
      script:
       - mkdir public
       - mv target/site/jacoco/index.html public
      artifacts:
        paths:
          - public
    
    deploy:
      stage: deploy
      script:
        - mvn $MAVEN_CLI_OPTS verify
      only:
        - master
    
    pom.xml
    中的
    jacoco
    插件:

    <plugin>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <version>0.7.5.201505241946</version>
        <executions>
            <execution>
                <id>pre-unit-test</id>
                <goals>
                    <goal>prepare-agent</goal>
                </goals>
            </execution>
            <execution>
                <id>post-unit-test</id>
                <phase>test</phase>
                <goals>
                    <goal>report</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
    
    
    org.jacoco
    jacocomaven插件
    0.7.5.201505241946
    单元前测试
    配制剂
    单元后测试
    测试
    报告
    
    我的项目是gitlab.com上的一个私人项目

    管道及其所有4个作业均已成功通过

    如何查看覆盖率报告?

    这里是GitLab员工

    如果管理员设置了GitLab页面,则可以通过转到(在项目中)设置
    ->
    页面
    来查看工件部署到的URL

    你应该看到:

    祝贺你!您的页面在以下位置提供:
    https://your-namespace.example.com/your-project


    点击那个链接,你就可以开始了!此外,我们正在扩展对HTML工件的支持。它的相关问题讨论现有的和即将推出的功能,这些功能可能会扩展到您在这里构建的功能

    您似乎忘记了在
    .gitlab ci.yml
    文件中添加对
    cat
    的调用

    你应该有这样的东西:

    script:
        - mvn $MAVEN_CLI_OPTS test
        - cat target/site/jacoco/index.html
    
    也就是说,我不认为这是最好的方法,因为您需要用原始HTML污染您的输出,以便检索所需的覆盖率值

    我建议改用本请求中描述的方法:

    • 将jacoco部分保存在
      build.xml
    • 使用此awk指令打印正确的代码覆盖率:

      awk -F"," '{ instructions += $4 + $5; covered += $5 } END { print covered, "/", 
      instructions, "instructions covered"; print 100*covered/instructions, "% 
      covered" }' target/site/jacoco/jacoco.csv
      
    • 用指令返回的内容替换Gitlab CI regexp:
      \d+。\d+\%covered

    编辑:

    从Gitlab 8.17开始,您可以直接在
    .Gitlab ci.yml
    文件中定义regexp,如中所述


    这似乎是多余的,但是如果这个regexp现在是您的存储库历史记录的一部分,您可以将它与用于计算它的其他工具一起更改。

    除了@SKBo所说的之外,我还想添加一个小的调整

    拥有

    cat target/site/jacoco/index.html

    将污染你的建设产出,使你难以阅读什么是重要的

    我建议:

    cat your/path/to/jacoco/report/index.html | grep-o.*.

    这将极大地降低噪音

    我正在使用以下代码:

    image: maven:latest sonarqube-check: script: - mvn verify sonar:sonar -Dsonar.host.url=$SONAR_HOST_URL -Dsonar.login=$SONAR_TOKEN -Dsonar.qualitygate.wait=true - cat target/site/jacoco/index.html | grep -o '.*' allow_failure: false coverage: "/Total.*?([0-9]{1,3})%/" 图片:maven:最新 要检查的声纳: 脚本: -mvn验证sonar:sonar-Dsonar.host.url=$sonar\u host\u url-Dsonar.login=$sonar\u TOKEN-Dsonar.qualitygate.wait=true -cat target/site/jacoco/index.html | grep-o'.*' 允许失败:false 覆盖范围:“/Total.*([0-9]{1,3})%/”
    我在
    .gitlab ci.yml

    cat target/site/jacoco-merge/index.html | grep -o 'Total[^%]*%' | sed 's/<.*>/ /; s/Total/Jacoco Coverage Total:/'
    
    然后您可以使用gitlabs文档中提到的正则表达式:

    Total.*?([0-9]{1,3})%
    
    或者您可以使用:

    Jacoco Coverage Total: ([0-9]{1,3})%
    

    要显示基本总覆盖率百分比,您只需:

    测试:
    阶段:测试
    图片:maven:3.6.3-jdk-11
    -mvn$MAVEN_CLI_选项测试
    -cat target/site/jacoco/index.html | grep-o'Total[^%]*%'
    覆盖率:'/Total.*?([0-9]{1,3})%/'
    人工产品:
    路径:
    -target/site/jacoco/jacoco.xml
    到期日:1个月
    规则:
    -如果:“$CI_管道_源==”合并请求_事件“'
    
    如果要启用代码覆盖率可视化功能:

    可视化测试覆盖范围:
    阶段:可视化测试覆盖率
    图片:registry.gitlab.com/haynes/jacoco2cobertura:1.0.7
    脚本:
    -'python/opt/cover2cover.py target/site/jacoco/jacoco.xml src/main/java>target/site/cobertura.xml'
    -'python/opt/source2filename.py target/site/cobertura.xml'
    需要:[“测试”]
    依赖项:
    -试验
    人工产品:
    报告:
    cobertura:target/site/cobertura.xml
    规则:
    -如果:“$CI_管道_源==”合并请求_事件“'
    

    有关详细信息,请查看官方Gitlab文档,而不是尝试解析HTML输出,此短awk脚本从jococo.csv文件中提取百分比

    #!/bin/sh
    
    # This awk script calculates a code coverage %
    # usage: pass the the jacoco.csv file as first argument
    
    awk -F "," '
        {
          instructions += $4 + $5; covered += $5
        }
        END {
          print covered, "/", instructions, "instructions covered";
          printf "%.2f%% covered\n", covered / instructions * 100
        }' "$1"
    
    印刷品:

    coverage.sh target/site/jacoco/jacoco.csv 
    369992 / 469172 instructions covered
    78.86% covered
    

    您应该调整printf格式以匹配您的Gitlab coverage regex

    谢谢。我找到了页面和覆盖率报告html文件的链接。但是这个文件只包含代码覆盖率的简单百分比。你知道我怎样才能看到代码的覆盖率吗?我的意思是将覆盖的代码视为绿线,将未覆盖的代码视为红线或类似的东西?现在的链接是
    jacoo/report/html/index.html
    ,因此,最后的命令是
    cat-your/path/to/jacoo/report/html/index.html | grep-o.*。
    注意,也可以使用
    #/usr/bin/awk
    shebang,但由于与不同发行版和版本的gawk存在一些兼容性问题,它的可移植性较差。
    coverage.sh target/site/jacoco/jacoco.csv 
    369992 / 469172 instructions covered
    78.86% covered