GitLab配置项中的覆盖徽章,Python覆盖始终未知

问题描述

我正在尝试使用coverage.pyfor Python显示私有GitLab CE安装(v11.8.6)中的Python项目的badge覆盖范围。但是,徽章总是写着unknown

这是我的.gitlab-ci.yaml文件中的相关作业:

coverage:
    stage: test
    before_script:
        - pip3.6 install coverage
        - mkdir -p public
    script:
        - coverage run --source=my_service setup.py test
        - coverage report | tee public/coverage.txt
    artifacts:
        paths:
            - public/coverage.txt
    coverage: '/TOTALs+d+s+d+s+(d+%)/'

我希望徽章显示此URL上的实际覆盖范围,因此这是我在General/Badges下的项目设置中输入的内容:

http://<privategitlaburl>/%{project_path}/badges/%{default_branch}/coverage.svg?job=coverage

我使用GitLab页面阅读these instructions。但是,我不希望仅出于此目的使用页面,我正在处理一个Python项目。

根据配置项/CD设置中的示例,在this post中,coverage entry中的正则表达式应该可以工作。我可以通过在本地尝试来确认这一点:

$ grep -P "TOTALs+d+s+d+s+(d+%)" public/coverage.txt
TOTAL                                           289     53    82%

我也在CI/CD/Pipeline settings下的项目设置中的Test coverage parsing字段中尝试了相同的regex,但该页面上显示的徽章仍然显示unknown

文档对我来说不是很清楚,因为它没有描述整个过程。创建后很清楚how to use a badge,并且有将覆盖报告发布到页面的手册,但从提取分数到显示徽章似乎没有明确的路径。

我应该在.gitlab-ci.yaml文件中使用coverage项,还是在管道设置中填写正则表达式?

无论哪种方式,GitLab CI是否应基于此更新覆盖徽章,或者我是否需要使用其他工具(如coverage-badge)来执行此操作?

提取的覆盖率分数应该报告在哪里;如何确定我的正则表达式是否正常工作?


解决方案

我终于得到了今天我的Python项目显示百分比而不是未知的覆盖率标记。下面是我的.gitlab-ci.yml:

中的相关内容
job:
 script:
  - 'python -m venv venv'
  - '.venvScriptsactivate'
  - 'python -m pip install -r requirements.txt'
  - 'coverage run --source=python_project -m unittest discover ./tests'
  - 'coverage report --omit=things_that_arent_mine/*'
  - 'coverage xml'
 artifacts:
  reports:
   cobertura: 'coverage.xml'

我还使用了this后找到的repo CI/CD Settings>;General Pipeline>;Test Coverage Parsing中列出的gcovr正则表达式,以及this上的倒数第二个注释:

^TOTAL.*s+(d+\%)$

在Repo General Settings&>徽章中,我的徽章链接为:

http://gitlab-server/%{project_path}/-/jobs

我的徽章图像URL是:

http://gitlab-server/%{project_path}/badges/%{default_branch}/coverage.svg

我不太清楚Cobertura报告工件的用途(我认为它特别与merge requests有关),但我有它,因为教程带我走上了那条路。我确实确认从.gitlab-ci.yml中删除以下内容不会破坏工作页面上的徽章或覆盖范围编号:

  - 'coverage xml'
 artifacts:
  reports:
   cobertura: 'coverage.xml'

删除或注释时:

- 'coverage report --omit=things_that_arent_mine/*'
不会破坏回购的CI/CD作业页上显示的徽章和覆盖范围编号。我还尝试了一些在rubular中测试的正则表达式变体,但唯一没有导致GitLab呕吐的是gcovr变体。

希望这能有所帮助,要拼凑出这个徽章在Python项目中工作所需的内容是有些困难和艰巨的。

编辑: 我也刚刚想出了如何给覆盖率数字增加一些性感的精确度。如果将.gitlab-ci.yml的Coverage报告行更改为:

- 'coverage report --omit=things_that_arent_mine/* --precision=2'

和CI/CD设置>;常规管道>;测试覆盖率解析中的正则表达式:

^TOTAL.+?(d+.d+\%)$

这应该会为您提供一个非常精确的覆盖数字,实际上,除了您和我之外,没有人会关心这个数字。但天哪,我们肯定会知道覆盖率是99.99%还是100%。

相关文章