Gitlab 覆盖率徽章始终未知

fud*_*udo 17 testing code-coverage badge gitlab-ci

问题

我正在开发一个 Laravel 包项目,并设置一个管道来测试它(针对 php 7.3、7.4 和 8.0)合并请求,并将其发布到主分支上的包注册表。

我正在尝试为代码覆盖率设置一个徽章,但我无法使其正常工作,因为它始终是显示unknown百分比。

我做了什么

管道

stages:
  - dependancies
  - linting
  - test
  - publish

# Dependancies job
download dependancies:
  stage: dependancies
  # job stuff

# Linting jobs
phpcs:
  stage: linting
  # job stuff

# test jobs templates
.testing_template: &testing
  stage: test
  script:
    - php -dxdebug.mode=coverage vendor/bin/phpunit --coverage-text --colors=never
  only:
    - merge_requests

# Testing jobs
php 8:
  image: mileschou/xdebug:8.0
  <<: *testing

php 7.4:
  image: mileschou/xdebug:7.4
  <<: *testing

php 7.3:
  image: mileschou/xdebug:7.3
  <<: *testing


#  Publish to package registry
publish:
  only:
    - master
    - tags
  # job stuff
Run Code Online (Sandbox Code Playgroud)

所以我的管道工作如下:

  • 在功能分支上
    • 下载依赖项
    • 皮棉代码
    • 针对 php 7.3、7.4 和 8.0 进行测试
  • 在主分支和标签上
    • 将包发布到包注册表

所以合并请求上执行的部分如下

在此输入图像描述

此外,我可以在管道作业部分看到每个测试作业的代码覆盖率

在此输入图像描述

(我不确定为什么测试会导致不同的代码覆盖率百分比,因为代码库是相同的,但显然与 php 版本有关,并且可能与代码解析中完成的特定优化有关。)

徽章

由于这是一个 Laravel 包项目,我正在使用 PhpUnit 对其进行测试,因此我使用给定的正则表达式进行测试覆盖率解析设置(取自 Gitlab 文档

^\s*Lines:\s*\d+.\d+\%
Run Code Online (Sandbox Code Playgroud)

我想要一个徽章来显示 上的代码覆盖率状态master branch,而不是功能分支上的代码覆盖率状态,因此我创建了一个带有徽章图像 url 的覆盖率徽章,如下所示(我添加了对特定测试作业的引用,即php 7.4

https://gitlab.com/%{project_path}/badges/%{default_branch}/coverage.svg?job=php%207.4
Run Code Online (Sandbox Code Playgroud)

但它一直显示为

在此输入图像描述

我认为 Gitlab 无法找到所需的php 7.4作业,因为它不是在分支上执行master而是在功能分支上执行,因此我尝试将%{default_branch}占位符替换为 来%{commit_sha}引用特定提交,但这也不起作用,因为(我想)它引用了合并提交(仅触发发布作业),而不是触发整个管道的提交。

我被困住了

我不知道如何获取master分支的代码覆盖率百分比。

我不想在主分支上再次执行测试,因为我已经在合并之前测试了功能分支。

我能怎么做?我错过了什么吗?

小智 16

对于一个 python 项目,我也在努力解决这个问题,发现测试覆盖率结果现在已被弃用(https://docs.gitlab.com/ee/ci/pipelines/settings.html#add-test-coverage-results-to -a-合并请求-已弃用

我的答案是使用coveragemy 中的关键字.gitlab-ci.yml和所需的正则表达式从作业日志中提取百分比

例如

test:
  stage: test
  extends: .python-reports
  script:
    - pipenv run pytest --cov --cov-report term-missing --cov-report xml:./coverage_out_report.xml --junitxml=./test_out_report.xml
  coverage: '/TOTAL.*\s+(\d+%)$/'
Run Code Online (Sandbox Code Playgroud)

我的徽章定义为

关联https://gitlab.com/%{project_path}/-/commits/%{default_branch}

徽章图像 URLhttps://gitlab.com/%{project_path}/badges/%{default_branch}/coverage.svg

现在我看到主(或主)上的覆盖率为 100%,并且有一个漂亮的绿色徽章


Rez*_*our 12

我在不同的堆栈(Java、Gradle 和 Jacoco)中遇到了同样的问题。我已经解决了这个问题,我将分享我所做的事情。我希望我的解决方案能给您一些想法。

首先,在您的项目中,转到“设置” > “CI/CD”并展开“常规管道”部分。根据您使用的工具,使用适当的正则表达式填充测试覆盖率解析文本框。您可以在此页面上找到这些正则表达式的示例列表: 测试覆盖率解析示例

Gitlab 希望测试运行器工具将根据 CI 作业日志中某处给定的正则表达式打印测试覆盖率百分比。如果测试运行器引擎未将其打印到控制台,您可以手动执行。例如:

test:
  stage: test
  script:
    - gradle test jacocoTestReport --info
    # Print test coverage to console
    - cat build/reports/jacoco/test/html/index.html | grep -o 'Total[^%]*%'
  artifacts:
    paths:
      - build/reports/jacoco/test/*
Run Code Online (Sandbox Code Playgroud)

确保日志中存在测试覆盖率后,徽章将完美运行。

管道和覆盖范围徽章示例

  • 2022 更新 - _“此功能已处于生命周期结束阶段。它在 GitLab 14.8 中已弃用。该功能在 GitLab 15.0 中已删除。”_ 来自 [Gitlab 文档](https://docs.gitlab.com/ ee/ci/pipelines/settings.html#add-test-coverage-results-using-project-settings-removed) (3认同)