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

时间:2017-12-30 09:52:18

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

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

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

    .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个作业成功通过。

    如何查看报道报告?

8 个答案:

答案 0 :(得分:18)

您似乎忘记在cat文件中添加.gitlab-ci.yml的来电。

你应该有类似的东西:

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中所述。

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

答案 1 :(得分:10)

GitLab员工在这里。

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

你应该看到:

<强>恭喜!您的网页在以下网址投放: https://your-namespace.example.com/your-project

点击该链接,你应该好好去!我们还扩展了对HTML工件的支持。 This issue及其相关问题讨论现有和即将推出的功能,这些功能可能会扩展您在此处构建的功能。

答案 2 :(得分:4)

我正在使用以下代码:

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})%/"

答案 3 :(得分:2)

我在 .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})%

答案 4 :(得分:2)

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

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

答案 5 :(得分:1)

添加目标prepare-agent

的配置
 <configuration>
 <!-- Sets the path to the file which contains the execution data. -->
 <destFile>${project.build.directory}/coverage-reports/jacoco-ut.exec</destFile>
 <!--Sets the name of the property containing the settings
                            for JaCoCo runtime agent.-->
 <propertyName>surefireArgLine</propertyName>
 </configuration>

此外,在插件maven-surefire-plugin中,在

的配置下添加以下属性
<argLine>surefireArgLine</argLine>

开启执行测试目标。报告将生成。 生成的jacoco-ut.exec只能使用IDE查看。

以下是示例项目https://github.com/r-sreesaran/http-patch-jax-rs

有关更多信息,请参阅https://www.petrikainulainen.net/programming/maven/creating-code-coverage-reports-for-unit-and-integration-tests-with-the-jacoco-maven-plugin/

在“artifacts”部分下的.gitlab-ci.yml文件中根据pom.xml中的路径配置对其进行修改

artifacts:
   paths:
     - target/coverage-reports/

答案 6 :(得分:1)

除了@SKBo所说的之外,我还想做一点调整。

拥有

  

cat target / site / jacoco / index.html

将污染您生成的输出,导致难以阅读重要内容。

我建议它:

cat your/path/to/jacoco/report/index.html | grep -o '<tfoot>.*</tfoot>'

那将大大减少噪音

答案 7 :(得分:1)

这个简短的 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 覆盖率正则表达式