Gitlab 覆盖徽章总是未知 管道徽章

问题描述

问题

我正在处理一个 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

所以我的管道工作如下:

  • 功能分支上
    • 下载依赖
    • lint 代码
    • 针对 PHP 7.3、7.4 和 8.0 进行测试
  • 在主分支和标签

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

enter image description here

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

enter image description here

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

徽章

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

^\s*Lines:\s*\d+.\d+\%

我想要一个master branch 上而不是在功能分支上显示代码覆盖状态的徽章,所以我创建了一个带有徽章图像 URL 的覆盖徽章,如下所示(我添加了对特定测试作业,即 PHP 7.4)

https://gitlab.com/%{project_path}/badges/%{default_branch}/coverage.svg?job=PHP%207.4

但它一直显示

enter image description here

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

我被卡住了

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

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

我该怎么办?我错过了什么吗?

解决方法

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

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

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

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

pipeline and coverage badge sample

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...