微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?