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

/ 0评 / 1
GitHub Actions

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

一脸懵逼

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

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

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

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

name: Test and Pylint

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

jobs:

  # 这个 job 的名字叫 linting
  linting:

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

    steps:
    # 代码检出
    - name: Checkout
      uses: actions/[email protected]
      id: checkout
    
    # 下面是安装 Python 和包依赖的
    # 这里选定版本为3.7 - 大家也可以通过 matrix 构建测试环境矩阵
    - name: Setup Python
      uses: actions/[email protected]
      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 中,代码中有几个点可能难以理解,我大概说明一下:

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

"""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) + '"')

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

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

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

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

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

自动评分
知识共享许可协议
本作品采用知识共享署名 4.0 国际许可协议进行许可。

发表评论

电子邮件地址不会被公开。 必填项已用*标注