首页 > 解决方案 > 从 GitLab-CI 中的 docker 容器中提取测试覆盖率

问题描述

我正在使用 GitLab-CI 并运行借助 Gradle 构建的 java 应用程序。

Docker 容器内运行着一个应用程序。同时,作业自动化运行 ApiTestSuite 测试套件以及 java 应用程序。

问题是:如何在ApiTestSuite套件结束后从正在运行的应用程序中获取测试覆盖率?

这是 GitLab 作业的简化版本:

automation:
  stage: validate
  tags:
    - dind
  variables:
    PROFILE: some-profile
  services:
    - docker:stable-dind
    - redis:5-alpine
    - webcenter/activemq
  before_script:
    - docker run --detach --name MY_APPLICATION
  script:
    - ./gradlew ApiTestSuite

我可以在运行单元测试用例时获取代码覆盖率,但在理解如何为上面的示例实现它时遇到一些问题。

先感谢您 :)

标签: javadockergitlabcode-coveragegitlab-ci

解决方案


  1. 告诉 java 在容器内运行应用程序时使用 JaCoCo 代理

-javaagent:/home/java/jacoco.jar=destfile=folder_inside_contrainer/jacoco-it.exec,append=true

  1. 配置 Agent 以将结果写入folder_inside_container

replace *folder_inside_contrainer* with the one you will share with the host later on

  1. 在容器和主机之间共享文件夹folder_inside_container(在本例中为 GitLab 作业)

docker run -d -v gitlab_folder:folder_inside_contrainer

  1. 通过 JaCoCo-cli.jar 将 .exec 格式的结果导出为 .html 格式

java -jar jacococli.jar report gitlab_folder/jacoco-it.exec --classfiles path_to_app_compiled_classes --html coverage/api-coverage-html

  1. 从 HTML 中获取覆盖范围并为该作业显示它
api-coverage:
  stage: release
  script:
    - 'apt-get install -y unzip'
    - 'curl -L "https://search.maven.org/remotecontent?filepath=org/jacoco/jacoco/0.8.6/jacoco-0.8.6.zip" -o jacoco.zip'
    - 'unzip jacoco'
    - 'java -jar lib/jacococli.jar report gitlab_folder/jacoco-it.exec --classfiles path_to_app_compiled_classes --html coverage/api-coverage-html'
    - grep -oP "Total.*?([0-9]{1,3})%" coverage/api-coverage-html/index.html
  coverage: "/Total.*?([0-9]{1,3})%/"
  artifacts:
    paths:
      - coverage/

推荐阅读