在GitLab中添加Pylint徽章

21

Gitlab具有生成有关构建状态和覆盖百分比的徽章功能。
是否可以创建自定义徽章来显示Pylint结果?或者只在README.md中显示这些结果?
我已经为Pylint创建了CI作业


Pylint 显示结果的格式是什么?成功/失败还是百分比? - Jakub Kania
PyLint的结果是评分。例如:7.5/10 - Djent
你是否曾经成功地获得了这个版本?另外,你是如何将gitlab-ci与pylint集成的?我刚刚尝试了一下,但遇到了问题,因为pylint返回值不是简单的0==ok。 - Dan R
我写了一个处理并翻译pylint退出代码的脚本 - https://github.com/jongracecox/pylint-exit Dan R - JGC
5个回答

43

我创建了一个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经常会生成非零返回代码。建议在CI管道中使用类似pylint-exit这样的工具来处理pylint返回代码。

2. 将徽章注册为管道artifact

我通过将以下内容包含在.gitlab-ci.yml中,将生成的徽章文件作为CI作业的artifact进行注册:

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

3. 将徽章发布到GitLab Pages

我包含了一个页面发布步骤,它将public目录中的所有内容部署到GitLab页面:

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

4. 在README.md中包含徽章

当项目的主要流程运行时,pylint.svg文件将被发布到GitLab Pages中。然后我可以从我的项目README.md引用该图像,以便显示最新的pylint徽章。

如果您正在使用https://gitlab.com进行项目,则svg工件的URL通常类似于以下内容(将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进行安装

示例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

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/

请注意,这里我复制了文件夹artifact中的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. 您可以在README中使用GitLab的内置徽章而非图像

GitLab现在可以在项目或组中包含徽章,并显示在项目标题中。

前往设置 / 常规 / 徽章,然后通过设置其链接和图像链接创建新徽章,如上所述:

gitlab徽章设置的截图


值得一提的是,我写了一个小工具叫做 pylint-exit,可以正确处理 pylint 的返回代码。它非常方便,值得使用,可以将退出代码转换为有用的返回代码,您可以用它来决定是否出错您的 CI 流水线。 - JGC
你需要确保svg文件是从创建它的作业中作为artifact被捕获的。进入该作业并检查artifact文件。您应该能够看到该文件并下载它。接下来,确保在页面作业运行之前将文件放入“public”文件夹中。接下来,确保页面作业已运行。这应该验证文件是否到达了正确的位置并发布到了页面上。URL应该类似于:https://user.gitlab.io/pylint.svg。有关更多详细信息,请参见https://docs.gitlab.com/ee/user/project/pages/getting_started_part_one.html#gitlab-pages-domain。 - JGC
Jader,我刚刚更新了我的答案,并加入了更多细节。 - JGC
4
抱歉打扰了,神器链接有问题吗?我可以通过“作业ID”(以zip或浏览方式)访问它们,但无法通过“主服务器”获取链接。只是想确认一下,我一直在尝试。 - Florian Heigl
1
很棒的答案。自2018年以来,您可以传递 --exit-zero 给 pylint 来强制使用 0 的退出代码。 - Kirk Broadhurst
显示剩余5条评论

6

2

我开发了一种实时作业徽章的解决方案。

虽然不是针对Pylint特定的,但这个方法是通用的,你可以轻松地将其修改为你所需要的。

这个样例仓库(分支badges)为每个CI作业创建了一个自定义徽章。也有一个完整的演示,这里就不再重复了。

核心思想是(假设您现在正在运行CI作业内部):

  • 创建一个徽章(例如从shields.io获取到一个文件)。
  • 上传徽章文件到一些实时存储中,以便可以链接到它(例如Dropbox)。

Dropbox支持通过HTTP请求调用其API(请参见此处)。因此,所有上述操作都可以使用curl或Python请求等基本工具来完成。您只需要将Dropbox访问令牌传递为密钥变量,并将文件保存为相同名称以覆盖旧的徽章。

然后,您可以直接在需要的地方链接Dropbox徽章。如果要使用它,请确保检查我的样例仓库中的一些技巧。对我来说,它运行得非常好,并且似乎很快。

此方法的优点是,您无需烦恼GitLab页面。而是将其放到Dropbox中。这是通过HTTP请求调用的简单文件传输。没有更多的操作。


有没有一种简单的方法可以根据分数轻松更改从shields.io获取的徽章的颜色?我过去曾经使用过这种方法,不得不在我的CI中包含条件逻辑来选择颜色。提供一个拉取徽章的代码示例会很好。 - JGC
我喜欢这种方法。我采用这种方法的原因是我正在使用一个内部企业版的GitLab,使用的runner没有互联网访问权限。我的方法意味着没有出站网络连接。我肯定会建议人们在考虑我的方法的同时也考虑你的方法。 - JGC
@JGC 很抱歉回复晚了,老实说自从我写这篇文章以来,我只在一个项目中搞过徽章 :-D。徽章拉取代码在 update_badge.sh 中。你可以在那里使用任何逻辑 - 例如根据分数设置徽章参数,我的只是一个例子。对于离线访问,您还可以在运行程序上预先获取一组徽章,然后离线决定需要什么。或者使用您的 anybadge 包 - 这完全取决于个人喜好。 - kubouch
2
顺便提一下,您现在可以在GitLab的项目/组描述下添加徽章:徽章 - kubouch

1
教程
  • Add the below file - .gitlab-ci.yml to your GitLab repository:

    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
    

  • Substitute the below variables accordingly depending upon your project structure.
    For example, if your repository is located at company_intern/john/robot_code and you added the .gitlab-ci.yml file to your main branch, then:

    $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)
    

  • Your badge has now been integrated!
    To verify the lining process locally before committing it directly:

    # 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 
    

参考文献:


0
如果您使用flake8来运行pylint,那么生成徽章的简单方法是使用genbadge。这个简单的命令行工具提供了生成测试、覆盖率和flake8徽章的功能。
只需运行
genbadge flake8 -i flake8stats.txt

要从 flake8 统计文件生成徽章,例如这个: enter image description here。然后,您可以使用徽章来快速链接到由 flake8-html 生成的 HTML 报告。详细信息请参阅文档(顺便说一下,我是作者!)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接