【问题标题】:Code coverage report using gitlab-ci.yml file使用 gitlab-ci.yml 文件的代码覆盖率报告
【发布时间】:2018-06-10 11:54:38
【问题描述】:

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

  1. 我在pom.xml 的插件列表中添加了jacoco
  2. 已将页面作业添加到我的 .gitlab-ci.yml 文件中。
  3. 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

jacoco 插件在pom.xml:

<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>

我的项目是gitlab.com 上的私人项目。

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

如何查看覆盖率报告?

【问题讨论】:

    标签: maven gitlab code-coverage gitlab-ci jacoco


    【解决方案1】:

    添加新作业,执行脚本

    awk -F"," '{ instructions += $4 + $5; covered += $5 } END { print int(100*covered/instructions), "% covered" }' target/site/jacoco/jacoco.csv
    

    得到这个

    74% 覆盖

    【讨论】:

      【解决方案2】:

      这个简短的 awk 脚本不是尝试解析 HTML 输出,而是从 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 覆盖范围正则表达式

      【讨论】:

      • 请注意,也可以使用#!/usr/bin/awk shebang,但由于与不同发行版和 gawk 版本存在一些兼容性问题,它的可移植性较差。
      【解决方案3】:

      为了显示基本的总覆盖率,您只需要:

      test:
        stage: test
        image: maven:3.6.3-jdk-11
          - mvn $MAVEN_CLI_OPTS test
          - cat target/site/jacoco/index.html | grep -o 'Total[^%]*%'
        coverage: '/Total.*?([0-9]{1,3})%/'
        artifacts:
          paths:
            - target/site/jacoco/jacoco.xml
          expire_in: 1 mos
        rules:
          - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
      

      如果您想启用代码覆盖率可视化功能:

      visualize_test_coverage:
        stage: visualize_test_coverage
        image: registry.gitlab.com/haynes/jacoco2cobertura:1.0.7
        script:
          - 'python /opt/cover2cover.py target/site/jacoco/jacoco.xml src/main/java > target/site/cobertura.xml'
          - 'python /opt/source2filename.py target/site/cobertura.xml'
        needs: [ "test" ]
        dependencies:
          - test
        artifacts:
          reports:
            cobertura: target/site/cobertura.xml
        rules:
          - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
      

      有关详细信息,请查看官方 Gitlab 文档here

      【讨论】:

      • 嗨@magiccrafter,我的目标文件夹没有自动获取jacoco文件夹我该怎么办?
      【解决方案4】:

      我在.gitlab-ci.yml使用这个命令

      cat target/site/jacoco-merge/index.html | grep -o 'Total[^%]*%' | sed 's/<.*>/ /; s/Total/Jacoco Coverage Total:/'
      

      这会打印一个没有混乱和html标签的漂亮字符串:

      Jacoco Coverage Total: 39%
      

      然后你就可以使用 gitlabs 文档中提到的正则表达式了:

      Total.*?([0-9]{1,3})%
      

      或者你可以使用:

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

      【讨论】:

        【解决方案5】:

        我正在使用此代码:

        图片:Maven:最新 声纳检查: 脚本: - mvn 验证声纳:声纳 -Dsonar.host.url=$SONAR_HOST_URL -Dsonar.login=$SONAR_TOKEN -Dsonar.qualitygate.wait=true - 猫目标/站点/jacoco/index.html | grep -o '.*' 允许失败:假 覆盖率:“/Total.*?([0-9]{1,3})%/”

        【讨论】:

          【解决方案6】:

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

          cat 目标/站点/jacoco/index.html

          会污染您构建输出,使您难以阅读重要的内容。

          我建议这样做:

          cat your/path/to/jacoco/report/index.html | grep -o '&lt;tfoot&gt;.*&lt;/tfoot&gt;'

          这样可以大大降低噪音

          【讨论】:

          • 链接现在是jacoco/report/html/index.html 所以,最后的命令是cat your/path/to/jacoco/report/html/index.html | grep -o '&lt;tfoot&gt;.*&lt;/tfoot&gt;'
          【解决方案7】:

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

          你应该有类似的东西:

          script:
              - mvn $MAVEN_CLI_OPTS test
              - cat target/site/jacoco/index.html
          

          话虽如此,我认为这不是最好的方法,因为您需要使用原始 HTML 污染您的输出才能检索所需的覆盖率值。

          我建议改用此拉取请求中描述的方法:https://github.com/jacoco/jacoco/pull/488

          • 将 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 正则表达式替换为指令返回的内容:\d+.\d+ \% covered

          编辑:

          从 Gitlab 8.17 开始,您可以直接在 .gitlab-ci.yml 文件中定义正则表达式,如 documentation 中所述。

          这似乎是多余的,但如果此正则表达式现在是您的存储库历史的一部分,您可以将其与用于计算它的其他工具一起更改。

          【讨论】:

          • 如果你使用多模块项目你可以做awk -F"," '{​ instructions += $4 + $5; covered += $5 }​ END {​ print 100*covered/instructions, "% tu covered" }​' `find . -name "jacoco.csv"`
          【解决方案8】:

          GitLab 员工在这里。

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

          你应该看到:

          恭喜!您的页面在以下位置提供服务: https://your-namespace.example.com/your-project

          单击该链接,您应该一切顺利!此外,我们正在扩展对 HTML 工件的支持。 This issue 及其相关问题讨论了现有和即将推出的功能,这些功能可能会扩展您在此处构建的内容。

          【讨论】:

          • 谢谢。我找到了页面和覆盖率报告 html 文件的链接。但是这个文件只包含代码覆盖率的简单百分比。你知道我怎样才能看到代码的覆盖率吗?我的意思是将覆盖的代码视为绿线,将未覆盖的代码视为红线或类似的东西?
          猜你喜欢
          • 1970-01-01
          • 2017-03-17
          • 1970-01-01
          • 2014-08-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多