如何用 GitHub Actions 写出高质量的 Python代码?

FightingCoder

共 5556字,需浏览 12分钟

 ·

2020-04-02 23:21

阅读本文大概需要 13 分钟。


这篇博文将与你分享如何在 Python 项目中搭建起 GitHub Actions 工作流,以确保你写出的代码既优雅,又符合所有最佳实践,且已经过完备测试。

25eec8b92f5977b6a96c03f4c6b351b7.webp


作者 | Wojciech Krzywiec

译者 | 香槟超新星,责编 | 郭芮

出品 | CSDN(ID:CSDNnews)


以下为译文:


最近,我决定开始学习 Python 了。如今它已位列最流行的编程语言之一,因此做出尝试一下的决定并没有什么困难的。尤其是我对自己的算法水平仍然不满意,所以我希望能够一石二鸟——学习 Python,并用一些算法题目来练手。因此,我在 GitHub 上创建了 Algorithms Python 项目,我会在上面发布一些自己觉得有趣的问题的答案。但是在练习过程中,我遇到了一个问题。


如何确保我的代码是高质量的?如何确保我的代码风格与官方指南PEP 8一致?以及如何检查代码的测试是否完备?


其实是有解决方案的!那就是 GitHub Actions!但是我想实现的究竟是什么?我将向你展示:


  • 如何集成 CodeFactor——一个可以在你的代码中发现潜在bug的工具;

  • 如何设置 wemake-python-styleguide GitHub Actions 工作流(用以检查你的代码是否符合 PEP 8);

  • 如何运行单元测试并通过 Codecov 报告覆盖范围。

在接下来的步骤中,我默认你已经在 GitHub 上有一个 Python 项目了。如果你没有的话,就请先创建一个吧。


CodeFactor这是一个非常简洁的工具,可以用来检查你的代码质量。它可以免费用于所有的公共库,以及1个私有库。首先,请先去官方网站 www.codefactor.io,并通过 GitHub 登录,创建一个新账号。(要完成此操作的)图标应该是位于主页的右上角。a3365abcbb93234ec0872c62d43a72cb.webp注册后,单击右上角的加号,将1 个库添加到你的控制面板。从列表中选中你要分析的库,然后单击页面底部的 import。e98e3d7b73df764fc4256364253e2911.webp然后就好啦!现在你应该已经转到一个包含着已发现的所有问题的列表的控制面板了。太棒了!


6f2656544c0cf45618f66d50e71c59ea.webp





wemake-python-styleguide
让我们接着讲第二个工具。这个工具能够检查代码是否符合官方 Python  风格指南。这次我们不用在任何 Web 服务中创建新账号。我们将搭建起一个 GitHub Actions 工作流,每当一个 pull request 被创建出来时,该工作流都会被触发,并会在发现潜在问题时添加评论。给那些还不了解 GitHub Actions 的人介绍一下:它是 GitHub 上的一项新功能,可以实现许多任务的自动化,通常被视为CI / CD工具(Continuous Integration/Continuous Deployment,持续集成/持续部署),能够进行测试,进行质量检查,然后部署。但这还不是它的唯一目标。开始时,首先在项目的根文件夹中创建一个.github / workflows 文件夹,你的工作流的定义将会被放在这里。然后创建一个新文件,命名为 workflow-pr.yaml。
name: Python Pull Request Workflowon: [pull_request]jobs:
qa: name: Quality check runs-on: ubuntu-18.04 steps: - uses: actions/checkout@v1 - name: Set up Python uses: actions/setup-python@master with: python-version: 3.8 - name: Run unit tests run: | pip install pytest pytest - name: Wemake Python Stylguide uses: wemake-services/wemake-python-styleguide@0.13.4 continue-on-error: true with: reporter: 'github-pr-review' env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
这是一个非常简单的工作流,全名为 Python Pull Request Workflow。每个 pull request 都能触发它,因此无论何时创建新的或更新现有的作业,都会运行。上面的工作流仅包含一个 qa 工作,分为 4 个步骤:


  • actions / checkout @ v1——必须让 GitHub Actions 工作流知道它可以使用库中的代码

  • 使用 actions/setup-python@master 的 Set up Python 配置好一个 Python 版本,在本例中为使用的是 python-version: 3.8。

  • Run unit tests 将运行位于项目中的所有单元测试。为此,我使用的是 pytest,首先需要安装 pip install pytest,以便可以运行下一个命令 pytest。如果这一步上有任何一个测试失败,则下一个测试将不会运行。

  • Wemake Python Styleguide 的这一个步骤是我们最感兴趣的。它使用wemake-services/wemake-python-styleguide@0.13.4 操作,这是工作流的基本组成单位。你可以在GitHub Marketplace上找到它们

    (https://github.com/marketplace?type=actions)

    就像上述提到的一样(https://github.com/marketplace/actions/wemake-python-styleguide)。将此代码配置为(with 语句)以使用github-pr-review reporter,就可以在 code review 中启用内联注释了。在官方网站上可以找到更多受支持的 reporter 选项。最后,此工作流需要传递你的 GIHUB_TOKEN,这就是添加 env 语句的原因。

为了测试它的运行,你需要创建一个新的 branch,提交一些更改并将其推送到 GitHub。然后创建一个  pull request,就能触发此工作流了。要检查它,请转到项目中的“Actions”选项,如果一切顺利则应如下图所示:


890e7bac41dd9e65cf373e61a7b70360.webp如果单击“Run unit tests”,则在 console log 中,你将看到测试报告:c34e196986d3f61e375ced6e3632b76d.webp如果返回到 Pull request,则应该看到添加的注释。就像这里那样:https://github.com/wkrzywiec/algorithms-python/pull/677ab39174c81cb54050c7f638dc83d14.webp



Codecov最后,我们想要一份涵盖范围的测试报告。为此,我们再次使用 pytest 库,它将为我们生成报告,然后我们将其上传到 Codecov,后续的可视化就由它完成。
在定义一个新的工作流之前,你首先需要先创建一个 Codecov 账号。因此,你需要先单击右上角的“Sign Up”按钮转到https://codecov.io。d08099c5354fdf14f0d86adf0b984ab4.webp然后选择 GitHub 注册。


94af9859c6d818868caaa6f53d84f4d9.webp


然后,你将被带到 GitHub 项目的控制面板,然后需要单击 Add new repository 按钮。


42c03726f7c1c4dbefa66b7840ac4427.webp


一个列表将出现,包含所有的项目,你可以从中选择一个来分析。70187e9a616c896a766eddc4680be889.webp然后会出现一个带有令牌(token)的页面。把它保存下来,因为下一步中会用到。
4bf2e4b9bf6ac9b702b62646d7bec4c5.webp现在回到 GitHub 的项目上,然后单击其“Settings”按钮。单击“Secrets”,然后添加一个新的 secret,这时就可以用上你在  Codecov 网站上生成的令牌了。要完成这一步,单击 Add secret。f9d528278b7c752e92d20da637f8bed0.webp好的,一切都已设置好了,接下来就可以继续定义 GitHub 工作流了。
name: Python Master Workflowon:  push:    branches:      - 'master'jobs:  codecov:    name: Codecov Workflow    runs-on: ubuntu-18.04    steps:      - uses: actions/checkout@v1      - name: Set up Python        uses: actions/setup-python@master        with:          python-version: 3.8      - name: Generate coverage report        run: |          pip install pytest          pip install pytest-cov          pytest --cov=./ --cov-report=xml      - name: Upload coverage to Codecov        uses: codecov/codecov-action@v1        with:          token: ${{ secrets.CODECOV_TOKEN }}          file: ./coverage.xml          flags: unittests
再次,我们创建一个单独的文件,命名为 workflow-master.yaml,因为这次我们不想在创建 pull request 时触发此工作流。这个工作流仅当在 master branch 上推送了新的提交时才会运行。在 jobs 部分中,只有一个名为 codecov 的作业,包括四步:


  • uses: actions/checkout@v1——这个步骤,跟上次一样,也只是为了告诉 GitHub Actions 我们要使用当前库里的文件

  • uses: actions/setup-python@master——这个步骤之前也提到过,这里我们设置的 Python 版本是 3.8

  • 然后是一个新步骤,负责生成覆盖率报告(Generate coverage report);这包含一系列脚本,涵盖了安装 pytests(pip install pytest),pytest-cov(pip install pytest-cov)和运行实际测试(pytest-cov =./-cov-report = xml),

  • 最终,生成的测试覆盖率报告可以上传到 Codecov(Upload coverage to Codecov)。在这里我们使用 uses: codecov / codecov-action @ v1(https://github.com/marketplace/actions/codecov)。在其中,我们提供 3 个参数:token: ${{ secrets.CODECOV_TOKEN }},取值自我们放置在 GitHub Secrets 保管库的文件,(之前的步骤生成的)测试覆盖率报告的位置是file:./coverage.xml,而 flags:unittests 是对我们的单元测试进行分组的标志。

要进行测试,你需要将一些提交 push 到 master branch。这可以直接在你的本地库中完成,也可以通过合并一个 pull request 完成。如果一切顺利,那页面应该是像这样的:


5c46f83b6aca30c463bfb02c8808a82f.webp现在,如果你回到 Codecov,回到你的项目控制面板,你应该能看到类似的输出:


ae46e2a3b65042b6dd4411e173c80f69.webp


好的,我们做到了!(Cheers!)在结尾之前,我想告诉你的是,能帮你写出更高质量代码的工具并非只有 CodeFactor,Codecov或wemake-python-styleguide。实际上,这样的工具有很多,例如 SonarCloud,Pylint,Coveralls,DeepSource 等等。其中一些可以在 GitHub Marketplace 上找到,如果你不喜欢我提议的这几个工具,那么最好从那上面的地方为起点开始寻找。



结论
希望通过这篇博文,你可以了解到,要如何设置 GitHub 库来确保写出高质量的代码。有了这样的工具集合,你可以找到所有的弱点和 bug,但要记住,不是每个 bug 和每个问题都值得去花心思。有时候,最好是更专注于实际工作,而不是整理那些臭代码库。(wink)原文:https://medium.com/@wkrzywiec/how-to-write-good-quality-python-code-with-github-actions-2f635a2ab09a作者:Wojciech Krzywiec,Java开发工程师,DevOps新手,终生学习者。


崔庆才

静觅博客博主,《Python3网络爬虫开发实战》作者

隐形字

个人公众号:进击的Coder

8073c81c7c66b7104272d339b3b2eb79.webp7629513f5d402e6a2a728e0edc1b805e.webp

长按识别二维码关注




推荐阅读

1

孙杨一夜之间风评变差,从数据上看是真的吗?

2

进来看看你中了几条

3

如何实现本地代码和远程的实时同步

4

如何用一条命令将网页转成电脑 App


好文和朋友一起看~
浏览 17
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报