使用GitHub Actions为Python代码自动评分
本文最后更新于 238 天前,其中的信息可能已经有所发展或是发生改变。
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 中,代码中有几个点可能难以理解,我大概说明一下:

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

我们现在看看 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 还会有一个漂亮的绿色对勾~

自动评分
暂无评论

发送评论 编辑评论


|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇