问题描述
问题
我正在处理一个 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
所以我的管道工作如下:
所以对合并请求执行的部分如下
此外,我可以在管道作业部分看到每个测试作业的代码覆盖率
(我不确定为什么测试会导致不同的代码覆盖率百分比,因为代码库是相同的,但显然与 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
但它一直显示为
我认为 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/*
在确保日志中存在测试覆盖率后,徽章将完美运行。