Значок Pylint в gitlab

В Gitlab есть функции для создания значков о состоянии сборки и проценте покрытия.
Можно ли создать собственный значок для отображения результатов Pylint? Или просто отобразить эти результаты в README.md?
У меня уже есть задание CI для Pylint


person Djent    schedule 30.03.2017    source источник
comment
В каком формате Pylint отображает результаты? Успех/неудача или проценты?   -  person Jakub Kania    schedule 31.03.2017
comment
Результатом PyLint является рейтинг. Например: 7,5/10   -  person Djent    schedule 06.04.2017
comment
Вы когда-нибудь получали версию этой работы? Кроме того, как вы интегрируете gitlab-ci со своим pylint? Я только что попробовал и попал в затруднительное положение, потому что возврат pylint не прост 0 == хорошо.   -  person Dan R    schedule 28.06.2017
comment
Dan R Я написал скрипт для обработки и перевода кодов выхода pylint - github.com/jongracecox/pylint-exit   -  person JGC    schedule 08.12.2017


Ответы (4)


Я написал пакет для создания значков на Python, который создает значки, очень визуально похожие на основные службы значков. Он очень гибкий, вы можете импортировать и использовать его в своем коде Python или запускать из командной строки.

Я использую это в GitLab CI для отображения оценок pylint и охвата.

Есть и другие способы сделать это с помощью shields.io (см. другой ответ от kubouch), но этот подход можно использовать в ситуациях, когда у вас может не быть внешнего доступа в Интернет, например, в корпоративной среде, где брандмауэры или прокси-серверы блокируют доступ в Интернет. .

Настройка GitLab CI

1. Создайте значок

В моем конвейере CI есть шаг, который запускает pylint, и я использовал sed для извлечения оценки из выходного текста. Затем я использую anybadge (подробности ниже), чтобы сгенерировать значок оценки Pylint, и сохранить его как public/pylint.svg.

pylint:
  stage: test
  script:
    - pylint --rcfile=.pylintrc --output-format=text <LIST-OF-FILES-TO-RUN-PYLINT-AGAINST> | tee pylint.txt
    - score=$(sed -n 's/^Your code has been rated at \([-0-9.]*\)\/.*/\1/p' pylint.txt)
    - echo "Pylint score was $score"
    - anybadge --value=$score --file=public/pylint.svg pylint

Если pylint сгенерирует ненулевой rc, то GitLab расценит это как ошибку команды, и задание завершится ошибкой, то есть значок не будет создан, а отсутствующее изображение покажет, где используется значок.

ПРИМЕЧАНИЕ: pylint ЧАСТО БУДЕТ генерировать ненулевые коды возврата, поскольку он использует код выхода для сообщения о состоянии проверки lint. Я предлагаю использовать что-то вроде pylint-exit для обработки кодов возврата pylint в конвейерах CI.

2. Зарегистрируйте значок как артефакт конвейера

Я регистрирую сгенерированный файл значка как артефакт в задании CI, включив его в .gitlab-ci.yml:

pylint:
    ...
    - echo "Pylint score was $score"
    - anybadge --value=$score --file=public/pylint.svg pylint
  artifacts:
    paths:
      - public/pylint.svg

3. Опубликовать значок на страницах GitLab

Я включаю шаг публикации страниц, который развертывает все в публичном каталоге на страницах GitLab:

pages:
  stage: deploy
  artifacts:
    paths:
    - public
  only:
  - master

4. Включить бейдж в README.md

Когда главный конвейер запускается для проекта, файл pylint.svg публикуется на страницах GitLab, и затем я могу ссылаться на изображение из моего проекта README.md, чтобы отображался последний значок pylint.

Если вы используете https://gitlab.com для своего проекта, URL-адрес файла svg артефакт обычно будет примерно таким (замените NAMESPACE своим именем пользователя или именем группы, если ваш проект находится в группе — подробнее здесь):

https://NAMESPACE.gitlab.io/pyling.svg

В свой README.md вы можете включить изображение с:

![pylint](https://NAMESPACE.gitlab.io/pyling.svg)

Если вы хотите превратить изображение в ссылку, вы можете использовать:

[![pylint](https://NAMESPACE.gitlab.io/pyling.svg)](LINKTARGET)

Дайте мне знать, если вам нужна дополнительная информация о какой-либо настройке.

Пакет Anybadge Python

Вот еще немного информации о пакете anybadge Python:

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

Вот ссылка на проект github с более подробной документацией: https://github.com/jongracecox/anybadge

Установить с помощью pip install anybadge

Пример кода питона:

import anybadge

# Define thresholds: <2=red, <4=orange <8=yellow <10=green
thresholds = {2: 'red',
              4: 'orange',
              6: 'yellow',
              10: 'green'}

badge = anybadge.Badge('pylint', 2.22, thresholds=thresholds)

badge.write_badge('pylint.svg')

Пример использования командной строки:

anybadge --label pylint --value 2.22 --file pylint.svg 2=red 4=orange 8=yellow 10=green

Обновление 2019

Использование GitLab Pages больше не требуется

Теперь можно непосредственно получить доступ к последний артефакт, упрощающий обходной путь.

  1. Используйте специальный артефакт pylint вместо public и удалите ненужный шаг deploy (или отредактируйте его, если он уже используется):
pylint:
  stage: test
  before_script:
    - pip install pylint pylint-exit anybadge
  script:
    - mkdir ./pylint
    - pylint --output-format=text . | tee ./pylint/pylint.log || pylint-exit $?
    - PYLINT_SCORE=$(sed -n 's/^Your code has been rated at \([-0-9.]*\)\/.*/\1/p' ./pylint/pylint.log)
    - anybadge --label=Pylint --file=pylint/pylint.svg --value=$PYLINT_SCORE 2=red 4=orange 8=yellow 10=green
    - echo "Pylint score is $PYLINT_SCORE"
  artifacts:
    paths:
      - ./pylint/

Обратите внимание, что здесь я копирую файл журнала Pylint в артефакт папки, таким образом, он будет доступен без просмотра журналов конвейера.

После этого изображение значка будет доступно по адресу https://gitlab.example.com/john-doe/foo/-/jobs/artifacts/master/raw/pylint/pylint.svg?job=pylint, а журнал Pylint — по адресу https://gitlab.example.com/john-doe/foo/-/jobs/artifacts/master/raw/pylint/pylint.log?job=pylint.

2. Вы можете использовать встроенные значки GitLab вместо изображений в README.

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

Дошли до Settings / General / Badges, затем создаем новый значок, установив его ссылку и ссылку на изображение, как описано выше:

скриншот настроек значков gitlab

person JGC    schedule 17.11.2017
comment
Я только что обновил, чтобы включить команду pylint и команду sed для извлечения оценки. - person JGC; 08.12.2017
comment
Также стоит упомянуть, что я написал небольшую утилиту под названием pylint-exit для правильной обработки кодов возврата pylint. Это довольно аккуратно, и его стоит использовать для преобразования кодов выхода в полезный код возврата, который вы можете использовать, чтобы решить, следует ли ошибаться в конвейере CI. - person JGC; 08.12.2017
comment
Что произойдет, если шаг не удастся? Затем значок не создается (это означает, что либо значок недоступен, либо значок предыдущего конвейера все еще отображается). - person tangoal; 18.08.2018
comment
Я также не получаю переменную $file_list. Откуда это взялось? - person tangoal; 18.08.2018
comment
В переменную $file_list вы можете добавить свой список файлов для запуска pylint. Я обновил пример, чтобы прояснить это. Кроме того, если шаг завершится ошибкой, файл значка не будет создан. Если задание pylint завершится ошибкой, а задание pages в конвейере CI запустится, вы получите отсутствующее изображение, на котором отображается значок. Если шаг pages не выполняется, вы, скорее всего, увидите старый значок. Это будет зависеть от того, есть ли у вас allow_failure: true на вашей pylint работе. - person JGC; 20.08.2018
comment
Джейдер, я только что обновил свой ответ, добавив некоторые подробности по этому поводу. - person JGC; 29.01.2019
comment
Извините за беспокойство, но что-то не так с URL-адресами артефактов? Я могу получить к ним доступ через идентификатор задания (как zip или просмотр), но я не могу позволить мне получить их по URL-адресу через master. Просто ищу подтверждение, продолжаю пробовать. - person Florian Heigl; 19.06.2020
comment
Отличный ответ. К вашему сведению, с 2018 года вы можете передать --exit-zero в pylint, чтобы принудительно ввести код выхода 0. - person Kirk Broadhurst; 13.07.2021

Если вы не хотите использовать README, страницы gitlab, любой бейдж или дропбокс, вы можете использовать https://img.shields.io/badge/lint%20score-$score-blue.svg, чтобы «создать» значок (который является просто URL-адресом) и изменить URL-адрес изображения значка через API гитлаба.

введите описание изображения здесь

Подробности и этап проверки моего .gitlab-ci.yml

person Manuel    schedule 20.05.2019

Я разработал обходное решение для значков в реальном времени для каждой работы. Это не специфично для Pylint, но подход является общим, и вы можете легко изменить его так, как вам нужно.

В этом примере репозитория (ветвь badges) создается собственный значок для каждого задания CI. Существует также полное пошаговое руководство, поэтому я не буду его копировать и вставлять сюда.

Основная идея (при условии, что вы сейчас находитесь внутри работающего задания CI):

  • Создайте значок (например, скачайте его с сайта shields.io в файл).
  • Загрузите файл значка в какое-либо хранилище в реальном времени, откуда его можно будет связать (например, Dropbox).

Dropbox поддерживает вызов своего API через HTTP-запросы (см. это). Таким образом, все вышеперечисленное можно сделать, например, с помощью запросы curl или Python — базовые инструменты. Вам просто нужно передать токен доступа Dropbox как секретную переменную и сохраните файл под тем же именем, чтобы перезаписать старый значок.

Затем вы можете напрямую связать значок Dropbox там, где вам нужно. Есть несколько хитростей, поэтому обязательно ознакомьтесь с моим репозиторием с примерами, если хотите его использовать. Для меня это работает довольно хорошо и, кажется, быстро.

Преимущество этого метода в том, что вам не нужно возиться с GitLab Pages. Вместо того, чтобы публиковать на Pages, вы размещаете его в Dropbox. Это простая передача файлов, вызываемая HTTP-запросом. Не более того.

person kubouch    schedule 19.01.2018
comment
Есть ли способ легко изменить цвет значков, извлеченных из Shields.io, в зависимости от очков? Я использовал этот подход в прошлом, и мне приходилось включать условную логику в мой CI, чтобы выбрать цвет. Пример вашего кода для извлечения значка был бы хорош. - person JGC; 20.08.2018
comment
Мне нравится этот подход. Причина, по которой я выбрал свой подход, заключается в том, что я использую внутреннюю корпоративную версию GitLab, используя бегунов, у которых нет доступа в Интернет. Мой подход означает отсутствие исходящих сетевых подключений. Я определенно рекомендую людям рассмотреть ваш подход наряду с моим. - person JGC; 29.01.2019
comment
@JGC Извините за поздний ответ, честно говоря, я возился со значками только в одном проекте с тех пор, как написал это :-D. Код получения значка находится в update_badge.sh. Вы можете использовать любую логику — например, установить параметры значка на основе баллов, мой пример — это просто пример. Для автономного доступа вы также можете предварительно загрузить набор значков на бегун, а затем решить, что вам нужно, в автономном режиме. Или используйте свой пакет anybadge - все зависит от предпочтений. - person kubouch; 31.01.2019
comment
Кстати, теперь вы можете добавлять значки под описанием вашего проекта/группы в GitLab: Значки - person kubouch; 31.01.2019

Если вы используете flake8 для запуска pylint, то простой способ создать значок — использовать genbadge. Этот простой инструмент командной строки предоставляет возможности для создания значков для тестов, покрытия и Flake8.

Просто запустите

genbadge flake8 -i flake8stats.txt

для создания значка из файла статистики flake8, такого как этот: введите здесь описание изображения. Затем вы можете использовать значок, чтобы предоставить быструю ссылку на отчет HTML, созданный flake8-html. Подробности см. в документации (кстати, я автор !).

person smarie    schedule 18.05.2021