Gitlab具有制作关于构建状态和覆盖率百分比的徽章的功能
是否可以创建自定义徽章以显示Pylint结果?
或者只是在README.md中显示这个结果?
我已经为Pylint做了CI工作
答案 0 :(得分:20)
我编写了一个python徽章生成包,可以在视觉上与主徽章服务类似地生成徽章。它非常灵活,您可以在python代码中导入和使用它,或者从命令行运行。
我在GitLab CI中使用它来显示pylint和覆盖率分数。
还有其他方法可以使用shields.io执行此操作(请参阅other answer中的kubouch),但此方法可用于您可能无法访问外部Internet的情况,例如防火墙或代理阻止互联网访问的企业/企业设置。
我的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 WILL OFTEN会生成非零返回码,因为它使用退出代码来传达lint检查的状态。我建议使用类似pylint-exit的内容来处理CI管道中的pylint返回码。
我将生成的徽章文件注册为CI作业中的工件,方法是将其包含在.gitlab-ci.yml
中:
pylint:
...
- echo "Pylint score was $score"
- anybadge --value=$score --file=public/pylint.svg pylint
artifacts:
paths:
- public/pylint.svg
我包含一个页面发布步骤,它将公共目录中的所有内容部署到GitLab页面:
pages:
stage: deploy
artifacts:
paths:
- public
only:
- master
当为项目运行主管道时,pylint.svg
文件将发布到GitLab页面,然后我可以从项目README.md
中引用该图像,以便显示最新的pylint徽章。 / p>
如果您的项目使用 https://gitlab.com ,则svg工件的网址通常是这样的(如果您的项目位于项目之下,则将NAMESPACE替换为您的用户名或组名称一组 - more details here):
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包的更多信息:
您可以设置徽章标签和值,也可以根据阈值设置颜色。有针对pylint,coverage和管道成功的预建设置,但您可以创建自己喜欢的任何徽章。
以下是github项目的链接,其中包含更详细的文档:https://github.com/jongracecox/anybadge
使用pip install anybadge
示例python代码:
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
答案 1 :(得分:1)
我为实时每个作业徽章开发了一个解决方法。 它不是Pylint特定的,但是这种方法很通用,您可以轻松地将其修改为您需要的内容。
This example repo(分支badges
)为每个CI作业创建自定义徽章。还有一个完整的演练,所以我不会在这里复制粘贴。
核心思想是(假设您现在正在运行的CI工作中):
Dropbox支持通过HTTP请求调用其API(请参阅this)。 因此,所有上述内容都可以使用例如完成。 curl或Python请求 - 基本工具。 您只需将Dropbox访问令牌传递为secret variable,并使用相同的名称保存文件以覆盖旧徽章。
然后,您可以直接将Dropbox徽章链接到您需要的任何位置。 有一些技巧,所以一定要检查我的示例回购,如果你想使用它。 对我而言,它运作良好,似乎很快。
此方法的优点是您不必弄乱GitLab页面。 您可以将它放在Dropbox上,而不是在Pages上发布。 这是HTTP请求调用的简单文件传输。 不多了。
答案 2 :(得分:1)
将以下文件 - .gitlab-ci.yml
添加到您的 GitLab 存储库:
pylint:
stage: test
image: python:3.7-slim
before_script:
- mkdir -p public/badges public/lint
- echo undefined > public/badges/$CI_JOB_NAME.score
- pip install pylint-gitlab
script:
- pylint --exit-zero --output-format=text $(find -type f -name "*.py" ! -path "**/.venv/**") | tee /tmp/pylint.txt
- sed -n 's/^Your code has been rated at \([-0-9.]*\)\/.*/\1/p' /tmp/pylint.txt > public/badges/$CI_JOB_NAME.score
- pylint --exit-zero --output-format=pylint_gitlab.GitlabCodeClimateReporter $(find -type f -name "*.py" ! -path "**/.venv/**") > codeclimate.json
- pylint --exit-zero --output-format=pylint_gitlab.GitlabPagesHtmlReporter $(find -type f -name "*.py" ! -path "**/.venv/**") > public/lint/index.html
after_script:
- anybadge --overwrite --label $CI_JOB_NAME --value=$(cat public/badges/$CI_JOB_NAME.score) --file=public/badges/$CI_JOB_NAME.svg 4=red 6=orange 8=yellow 10=green
- |
echo "Your score is: $(cat public/badges/$CI_JOB_NAME.score)"
artifacts:
paths:
- public
reports:
codequality: codeclimate.json
when: always
pages:
stage: deploy
image: alpine:latest
script:
- echo
artifacts:
paths:
- public
only:
refs:
- master
根据您的项目结构相应地替换以下变量。
例如,如果您的存储库位于 company_intern/john/robot_code
并且您将 .gitlab-ci.yml
文件添加到您的 main
分支,则:
$GROUP = company_intern
$SUBGROUP = john
$PROJECT_NAME = robot_code
$BRANCH = main
# Substitute the above variables in the badge
[![pylint](https://gitlab.com/$GROUP/$SUBGROUP/$PROJECT_NAME/-/jobs/artifacts/$BRANCH/raw/public/badges/pylint.svg?job=pylint)](https://gitlab.com/$GROUP/$SUBGROUP/$PROJECT_NAME/-/jobs/artifacts/$BRANCH/browse/public/lint?job=pylint)
您的徽章现已集成!
在直接提交之前在本地验证衬砌流程:
# To lint all the python files in the directory:
pylint --exit-zero --output-format=text $(find -type f -name "*.py" ! -path "**/.venv/**")
# To lint a specific file, say foo.py:
pylint --exit-zero --output-format=text foo.py
答案 3 :(得分:0)
如果您不想使用自述文件,gitlab页面,任何徽章或保管箱,则可以使用https://img.shields.io/badge/lint%20score-$score-blue.svg来“创建”徽章(只是URL)并通过gitlab更改徽章图像URL API。
答案 4 :(得分:0)
如果您使用 flake8
运行 pylint
,那么生成徽章的一种简单方法是使用 genbadge
。这个简单的命令行工具提供了为测试、覆盖率和 flake8 生成徽章的功能。
简单运行
genbadge flake8 -i flake8stats.txt
从 flake8 统计文件生成徽章,例如:。然后,您可以使用徽章提供指向 flake8-html
生成的 HTML 报告的快速链接。 See documentation for details(顺便说一下,我是作者!)。