gitlab中的Pylint徽章

时间:2017-03-30 19:09:56

标签: gitlab gitlab-ci pylint

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

5 个答案:

答案 0 :(得分:20)

我编写了一个python徽章生成包,可以在视觉上与主徽章服务类似地生成徽章。它非常灵活,您可以在python代码中导入和使用它,或者从命令行运行。

我在GitLab CI中使用它来显示pylint和覆盖率分数。

还有其他方法可以使用shields.io执行此操作(请参阅other answer中的kubouch),但此方法可用于您可能无法访问外部Internet的情况,例如防火墙或代理阻止互联网访问的企业/企业设置。

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 WILL OFTEN会生成非零返回码,因为它使用退出代码来传达lint检查的状态。我建议使用类似pylint-exit的内容来处理CI管道中的pylint返回码。

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 Pages

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

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

4。在README.md

中包含徽章

当为项目运行主管道时,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包

以下是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工作中):

  • 创建徽章(例如,将其从shields.io提取到文件中)。
  • 将徽章文件上传到可以链接的实时存储(例如Dropbox)。

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。

enter image description here

Details and the lint stage of my .gitlab-ci.yml

答案 4 :(得分:0)

如果您使用 flake8 运行 pylint,那么生成徽章的一种简单方法是使用 genbadge。这个简单的命令行工具提供了为测试、覆盖率和 flake8 生成徽章的功能。

简单运行

genbadge flake8 -i flake8stats.txt

从 flake8 统计文件生成徽章,例如:enter image description here。然后,您可以使用徽章提供指向 flake8-html 生成的 HTML 报告的快速链接。 See documentation for details(顺便说一下,我是作者!)。