如何用 GitHub Actions 写出高质量的 Python代码?
“
阅读本文大概需要 13 分钟。
这篇博文将与你分享如何在 Python 项目中搭建起 GitHub Actions 工作流,以确保你写出的代码既优雅,又符合所有最佳实践,且已经过完备测试。
作者 | Wojciech Krzywiec
译者 | 香槟超新星,责编 | 郭芮
出品 | CSDN(ID:CSDNnews)
以下为译文:
如何确保我的代码是高质量的?如何确保我的代码风格与官方指南PEP 8一致?以及如何检查代码的测试是否完备?
如何集成 CodeFactor——一个可以在你的代码中发现潜在bug的工具;
如何设置 wemake-python-styleguide GitHub Actions 工作流(用以检查你的代码是否符合 PEP 8);
如何运行单元测试并通过 Codecov 报告覆盖范围。
在接下来的步骤中,我默认你已经在 GitHub 上有一个 Python 项目了。如果你没有的话,就请先创建一个吧。
让我们接着讲第二个工具。这个工具能够检查代码是否符合官方 Python 风格指南。这次我们不用在任何 Web 服务中创建新账号。我们将搭建起一个 GitHub Actions 工作流,每当一个 pull request 被创建出来时,该工作流都会被触发,并会在发现潜在问题时添加评论。给那些还不了解 GitHub Actions 的人介绍一下:它是 GitHub 上的一项新功能,可以实现许多任务的自动化,通常被视为CI / CD工具(Continuous Integration/Continuous Deployment,持续集成/持续部署),能够进行测试,进行质量检查,然后部署。但这还不是它的唯一目标。开始时,首先在项目的根文件夹中创建一个.github / workflows 文件夹,你的工作流的定义将会被放在这里。然后创建一个新文件,命名为 workflow-pr.yaml。
这是一个非常简单的工作流,全名为 Python Pull Request Workflow。每个 pull request 都能触发它,因此无论何时创建新的或更新现有的作业,都会运行。上面的工作流仅包含一个 qa 工作,分为 4 个步骤:name: Python Pull Request Workflow
on: [pull_request]
jobs:
qa:
name: Quality check
ubuntu-18.04 :
steps:
uses: actions/checkout@v1
name: Set up Python
uses: actions/setup-python@master
with:
3.8 :
name: Run unit tests
run: |
pip install pytest
pytest
name: Wemake Python Stylguide
uses: wemake-services/wemake-python-styleguide@0.13.4
true :
with:
reporter: 'github-pr-review'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
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”选项,如果一切顺利则应如下图所示:
在定义一个新的工作流之前,你首先需要先创建一个 Codecov 账号。因此,你需要先单击右上角的“Sign Up”按钮转到https://codecov.io。然后选择 GitHub 注册。
现在回到 GitHub 的项目上,然后单击其“Settings”按钮。单击“Secrets”,然后添加一个新的 secret,这时就可以用上你在 Codecov 网站上生成的令牌了。要完成这一步,单击 Add secret。好的,一切都已设置好了,接下来就可以继续定义 GitHub 工作流了。
再次,我们创建一个单独的文件,命名为 workflow-master.yaml,因为这次我们不想在创建 pull request 时触发此工作流。这个工作流仅当在 master branch 上推送了新的提交时才会运行。在 jobs 部分中,只有一个名为 codecov 的作业,包括四步:name: Python Master Workflow
on:
push:
branches:
'master'
jobs:
codecov:
name: Codecov Workflow
ubuntu-18.04 :
steps:
uses: actions/checkout@v1
name: Set up Python
uses: actions/setup-python@master
with:
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
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 完成。如果一切顺利,那页面应该是像这样的:
希望通过这篇博文,你可以了解到,要如何设置 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
长按识别二维码关注
推荐阅读
1
2
3
4