使用GitHub Actions为Python代码自动评分

tech

This article was last updated on <span id="expire-date"></span> days ago, the information described in the article may be outdated.

最近我的开源 CMS 项目上线了,看到 GitHub 又推出了 Actions 这个新功能,才开始被整的一脸懵,完全不知道这个是干嘛的…

在学习了新的 YAML 语法、看了官方文档之后发现这个东西用来做 CI/CD 是非常方便的,于是决定使用它配合 Pylint 对代码自动评分来控制每次 push 的代码质量。

GitHub Actions 会使用一个完全隔离的虚拟环境每次运行我们的代码,所以我们需要在工作流中设置 CI/CD 的工作环境,并且绑定一些 GitHub 的动作,这样每次动作发生的时候我们的工作流就会自动被调用了。

这在团队协作开发的时候非常有用,我们可以自定义测试/评分脚本,这样就能避免质量过低/测试无法通过的代码被提交了。

下面给出使用 GitHub Actions 结合 Pylint 给你的代码自动评分的脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
name: Test and Pylint

# 工作流在每次代码 push 的时候触发
on: [push]

jobs:

# 这个 job 的名字叫 linting
linting:

# 在最新版的 ubuntu 上运行
runs-on: ubuntu-latest

steps:
# 代码检出
- name: Checkout
uses: actions/checkout@v2
id: checkout

# 下面是安装 Python 和包依赖的
# 这里选定版本为3.7 - 大家也可以通过 matrix 构建测试环境矩阵
- name: Setup Python
uses: actions/setup-python@v1
with:
python-version: 3.7 #

- name: Install dependencies
run:
python -m pip install --upgrade pip
pip install -r requirements.txt
pip install pylint

# 我将测试的代码保存在 run.py
- name: Test modules
run: python run.py
id: test

# 如果上一步的结果是成功的调用 pylint 为代码评分
- name: Pylinting
if: success()
run: python linting.py
id: linting

- name: Low score warning
if: steps.linting.outputs.score < 9
run: echo "Test passed, but score was too low."

- name: Passed
if: steps.linting.outputs.score >= 9
run: echo "All passed."

# 关于 outputs 在下面进行说明
- name: Show score
run: echo "Your score is ${{ steps.linting.outputs.score }}."

这段代码在 .github/workflows/main.yaml 中,代码中有几个点可能难以理解,我大概说明一下:

  • if: success() - 这个是 Actions 的自带函数,当上一步运行成功的时候才会执行当前的 step;这里的意思是:如果上面的测试都没有通过,就不用评分了
  • steps.linting.outputs.score - 在 id: linting 的那一个步骤中,我们调用了 python linting.py 它会在一个 actionssteps 环境变量中输出一个键值对,之后我们可以通过这个语句调用这个值

我们现在看看 linting.py 中的内容:

1
2
3
4
5
6
7
8
"""Linting and return score as system code"""

from os import system
from pylint.lint import Run

results = Run(["leaf"], do_exit=False)
score = round(results.linter.stats["global_note"], 2)
system('echo "::set-output name=score::' + str(score) + '"')

可以看到,我们评分获取到分数之后调用了系统命令:

1
echo "::set-output name=score::your_score"

这是 Github Actions 虚拟环境的 tricks,这样就可以将分数值留给下面的 step 去使用了。关于更多的指令,可以参考 GitHub 的官方帮助

有想法的朋友也可以使用测试的结果获取一个酷酷的 badge,每次可以根据自己的测试情况来动态的更改 badge 的图案。我这里因为单元测试还没有写完,暂时没有用到。

好了,我们现在可以给自己的代码评分了呦,每次测试通过的 commit 还会有一个漂亮的绿色对勾~

Author: 桂小方

Permalink: https://init.blog/1838/

文章许可协议:

如果你觉得文章对你有帮助,可以 支持我

Comments