Значок покрытия в Gitlab CI с покрытием Python всегда неизвестно

Я пытаюсь показать значок покрытия. для проекта Python в частной установке Gitlab CE (v11.8.6) с использованием покрытия. py для Python. Однако на значке всегда написано 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+%)/'

Я ожидал, что на значке будет отображаться фактическое покрытие по этому URL-адресу, поэтому я ввел это в настройках проекта в разделе _4 _ / _ 5_:

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

Я прочитал эти инструкции используя страницы Gitlab. Однако я не хочу использовать страницы только для этой цели, и я имею дело с проектом Python.

Согласно примеру в настройках CI / CD и в этот пост, регулярное выражение в coverage записи должно работать. что я мог подтвердить, попробовав его локально:

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

Я также попробовал то же регулярное выражение в поле Test coverage parsing в настройках проекта в разделе _10 _ / _ 11_, но значок, показанный на той же странице, продолжает показывать unknown.

Документация мне не совсем понятна, так как не описывает всю процедуру. Понятно, как использовать значок после создания, и есть руководство по публикации отчета о покрытии на страницах, но, похоже, нет четкого пути от извлечения оценки до отображения значка.

Должен ли я использовать запись coverage в моем .gitlab-ci.yaml файле или заполнять регулярное выражение в настройках конвейера?

В любом случае, Gitlab CI должен обновлять значок покрытия на основе этого, или мне нужно использовать дополнительные инструменты, такие как значок покрытия для этого?

Где должен быть сообщен извлеченный балл охвата; как я могу узнать, работает ли мое регулярное выражение?


person Carsten    schedule 14.05.2019    source источник
comment
Обновление: это действительно работает для отображения покрытия в конвейере Gitlab CI, но не создает значок. Может быть, это ожидаемое поведение, но кто знает?   -  person Carsten    schedule 17.05.2019
comment
Привет, @Carsten, ты нашел способ получить процент?   -  person Junkrat    schedule 27.05.2020
comment
@Junkrat Нет обновлений с моей стороны, извините.   -  person Carsten    schedule 27.05.2020


Ответы (3)


Я наконец-то получил значок покрытия, отображающий процент вместо неизвестного сегодня для моего проекта 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'

Я также использую регулярное выражение для gcovr, указанное в настройках CI / CD репозитория ›Общие конвейеры› Анализ тестового покрытия, который я обнаружил после прочтения this, а также предпоследний комментарий к это:

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

В репозитории Общие настройки ›Значки моя ссылка на значок:

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

а URL моего изображения значка:

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

Я не совсем понимаю, для чего нужен артефакт отчета Cobertura (я думаю, что он конкретно связан с запросы на слияние), но он у меня там, потому что обучающие программы повели меня по этому пути. Я подтвердил, что удаление следующего из .gitlab-ci.yml не нарушает значок или номер покрытия на странице вакансий:

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

При удалении или комментировании:

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

не повреждает значок, а также номер покрытия, отображаемый на странице заданий CI / CD репозитория. Я также пробовал несколько вариантов регулярных выражений, которые я тестировал в rubular, но единственный, который не вызывал gitlab для barf, был gcovr один.

Надеюсь, это поможет, было довольно сложно собрать воедино то, что было необходимо для того, чтобы этот значок работал над проектом на Python.

РЕДАКТИРОВАТЬ: Также только что выяснил, как добавить некоторую сексуальную точность к числу процента покрытия. Если вы измените строку отчета о покрытии файла .gitlab-ci.yml на:

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

И регулярное выражение в настройках CI / CD ›Общие конвейеры› Анализ покрытия тестирования для:

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

Это должно дать вам очень точный номер страхового покрытия, о котором никто, кроме вас и меня, не позаботится. Но, черт возьми, мы будем знать наверняка, 99,99% или 100% покрытие.

person wonkybadonk    schedule 06.11.2020

Я тоже немного вникнул в это. Как вы и сказали: команда coverage report выводит примерно такой результат:

[...]
tests/__init__.py              0      0   100%
tests/test_ml_squarer.py       4      0   100%
tests/test_squarer.py          4      0   100%
----------------------------------------------
TOTAL                         17      2    88%
test_service run-test: commands[4] | coverage xml

и в зависимости от сохраненного regex-выражения, он просто ищет 88% рядом с TOTAL. Я использовал рекомендацию для pytest-cov (Python), т.е. ^TOTAL.+?(\d+\%)$

выражение регулярного выражения

Так что запуск coverage xml в настоящий момент кажется мне необязательным. Однако у меня это не работает при использовании: GitLab Community Edition 12.10.11

person Thomas L.    schedule 21.01.2021
comment
нет или сейчас? ›Однако у меня это не работает - person Carsten; 21.01.2021
comment
К сожалению, это не так. - person Thomas L.; 21.01.2021
comment
Я заставил это работать, используя TOTAL.*\s+(\d+%)$ - person Thomas L.; 22.01.2021

Я потратил три дня на решение указанной выше проблемы, поэтому решил опубликовать свою рабочую конфигурацию. Мой проект представляет собой проект pyscaffolding, использует tox, конвейер срабатывает, когда вы отправляете фиксацию в ветку, и он отправляет пакет pip в библиотеку пакетов github.

  1. Ссылка на значок: http://gitlab.XXXX.com/XXmeXX/python-template/-/commit/develop

  2. Изображение значка: http://gitlab.XXXX.com/XXmeXX/python-template/badges/develop/coverage.svg.

  3. Регулярное выражение такое же, как указано выше.

  4. PYPIRC - это установленная переменная среды, которая выглядит как файл .pypirc и указывает на мой внутренний реестр пакетов.

  5. Я использовал это руководство

Мой gitlab-ci.yml:

build-package:
  stage: deploy
  image: python:3.7
  script:
   - set
   - cat $PYPIRC > /tmp/.pypirc
   - pip3 install twine setuptools setuptools_scm wheel tox coverage
   # build the pip package
   - python3 setup.py bdist_wheel
   # $CI_COMMIT_TAG only works with the tagging pipeline, if you want to test a branch push directly, pull from fs
   - VERSION=$(python setup.py --version)
   # You can issue ls -al commands if you want, like to see variables or your published packages
   # - echo $VERSION
   # - ls -al ./dist |grep whl
   - tox
   - coverage xml -o coverage.xml
   # If you want to put artifacts up for storage, ...
   # - mkdir public
   - python3 -m twine upload --repository pythontemplate ./dist/nbcuas_python_template-${VERSION}-py2.py3-none-any.whl --config-file /tmp/.pypirc
 artifacts:
   reports:
     cobertura : 'coverage.xml'
   when: always
#   If you were copying artifacts up for later.
#  paths:
#     - public
 only:
  - branches

Самым большим, что я узнал, было то, что сначала он отображается как столбец «Покрытие» в списке вакансий, а затем вы знаете, что все правильно разбираете и регулярные выражения работают. Оттуда вы работаете над xml покрытия и ссылками на значок.

person Tony Fraser    schedule 19.07.2021