Gitlab CI 中的覆盖率徽章与 Python 覆盖率始终未知

Car*_*ten 11 python code-coverage badge coverage.py gitlab-ci

我正在尝试在私有 Gitlab CE 安装(v11.8.6)中显示Python 项目的覆盖徽章,使用Python 的coverage.py。但是,徽章总是说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: '/TOTAL\s+\d+\s+\d+\s+(\d+%)/'
Run Code Online (Sandbox Code Playgroud)

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

http://<privategitlaburl>/%{project_path}/badges/%{default_branch}/coverage.svg?job=coverage
Run Code Online (Sandbox Code Playgroud)

我使用 Gitlab 页面阅读了这些说明。但是,我不想仅为此目的使用页面,而且我正在处理一个 Python 项目。

根据 CI/CD 设置中的示例,在这篇文章中coverage条目中的正则表达式应该可以工作。我可以通过在本地尝试来确认:

$ grep -P "TOTAL\s+\d+\s+\d+\s+(\d+%)" public/coverage.txt
TOTAL                                           289     53    82%
Run Code Online (Sandbox Code Playgroud)

我还在/Test coverage parsing下的项目设置字段中尝试了相同的正则表达式,但同一页面上显示的徽章一直显示。CI/CDPipeline settingsunknown

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

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

无论哪种方式,Gitlab CI 是否应该基于此更新覆盖徽章,还是我需要使用诸如coverage-badge 之类的其他工具来执行此操作?

应该在哪里报告提取的覆盖率分数;我怎样才能知道我的正则表达式是否有效?

won*_*onk 7

我今天终于为我的 python 项目获得了显示百分比而不是未知的覆盖率徽章。这是我的 .gitlab-ci.yml 中的相关内容:

job:
 script:
  - 'python -m venv venv'
  - '.\venv\Scripts\activate'
  - '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'
Run Code Online (Sandbox Code Playgroud)

我还使用了在回购CI上市gcovr正则表达式/ CD设置>通用管道>测试覆盖的解析,我看了之后发现这个以及倒数第二个评论

^TOTAL.*\s+(\d+\%)$
Run Code Online (Sandbox Code Playgroud)

在 repo General Settings > Badges 中,我的徽章链接是:

http://gitlab-server/%{project_path}/-/jobs
Run Code Online (Sandbox Code Playgroud)

我的徽章图片网址是:

http://gitlab-server/%{project_path}/badges/%{default_branch}/coverage.svg
Run Code Online (Sandbox Code Playgroud)

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

  - 'coverage xml'
 artifacts:
  reports:
   cobertura: 'coverage.xml'
Run Code Online (Sandbox Code Playgroud)

删除或评论时:

- 'coverage report --omit=things_that_arent_mine/*'
Run Code Online (Sandbox Code Playgroud)

确实破坏了在 repo 的 CI/CD 作业页面上显示的徽章和覆盖范围编号。我还尝试了一些我在rubular 中测试过的正则表达式变体,但唯一没有导致 gitlab 呕吐的变体是gcovr变体。

希望这会有所帮助,拼凑这个徽章在 python 项目上工作所需的东西有点困难和艰巨。

编辑:也只是想出了如何为覆盖百分比数字添加一些性感的精确度。如果将 .gitlab-ci.yml 的覆盖率报告行更改为:

- 'coverage report --omit=things_that_arent_mine/* --precision=2'
Run Code Online (Sandbox Code Playgroud)

以及 CI/CD 设置 > 通用管道 > 测试覆盖率解析中的正则表达式:

^TOTAL.+?(\d+.\d+\%)$
Run Code Online (Sandbox Code Playgroud)

这应该会给你一个非常精确的保险号码,实际上除了你我之外没有人会关心。但是天哪,我们肯定会知道覆盖率是 99.99% 还是 100%。


Tom*_*Tom 5

对我有用的解决方案:

在该.gitlab-ci.yml文件中,在运行覆盖率报告的作业中,我添加了以下几行:

  script:
    # some lines omitted for brevity
    - coverage report --omit=venv/*
  coverage: '/TOTAL.*\s+(\d+\%)/'
Run Code Online (Sandbox Code Playgroud)

unknown特别是,除非我将该指令添加到我的测试作业中,否则我无法让徽章显示任何内容coverage。请记住,不同的工具可能会打印不同的输出,因此您可能必须像我一样更改正则表达式。