从 GitLab-CI 中的 docker 容器中提取测试覆盖率

Extract test coverage from the docker container in GitLab-CI

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

Docker 容器中有一个应用程序 运行。同时,作业 automation 与 java 应用程序一起运行 ApiTestSuite 测试套件。

问题是: 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

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

提前谢谢你:)

  1. 告诉java使用JaCoCo代理,而运行容器内的应用程序

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

  1. 配置代理将结果写入folder_inside_contrainer

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

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

docker run -d -v gitlab_folder:folder_inside_contrainer

  1. 通过 JaCoCo-cli.jar
  2. 将 .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/