一个计算机技术爱好者与学习者

0%

好好学GitLab:GitLab CI配置代码质量检查

1. 怎样保证代码质量?

保证代码质量有三种常用的方法:Code Review、编码规范和单元测试。

Code Review需要别人帮助Review,现在可以找ChatGPT帮助Review。
而对于编码规范检查和运行单元测试,是可以通过CI流水线自动完成的。
本文中,我们学习在GitLab CI流水线中配置Python的编码规范检查和运行单元测试。

2. 编码规范检查

参考文档:

GitLab官方给的文档,使用codeclimate进行编码规范检查。
针对python,我们不使用codeclimate,而是使用更加常用的pylint或者flake8。

示例:

1
2
3
4
5
6
7
8
9
10
stages:
- code_check

code_check:
stage: code_check
image: python:3.7.10-slim-buster
before_script:
- pip install pylint -i https://pypi.tuna.tsinghua.edu.cn/simple
script:
- pylint **/*.py

编码规范检查,如果检查项比较多,建议使用 pre-commit 框架,详情参考 《git pre-commit 代码质量检查》

3. 单元测试

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
stages:
- unittest

unittest:
stage: unittest
image: python:3.7.10-slim-buster
before_script:
- pip install pytest -i https://pypi.tuna.tsinghua.edu.cn/simple
script:
- pytest --junitxml=report.xml tests/
artifacts:
reports:
junit: report.xml

下载report.xml的方法:进入CI/CD Pipelines页面,找到Job对应的Pipeline,最右边三个点,点击下载artifacts。

参考文档:

4. 单元测试覆盖率

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
stages:
- unittest

unittest:
stage: unittest
image: python:3.7.10-slim-buster
before_script:
- pip install pytest pytest-cov -i https://pypi.tuna.tsinghua.edu.cn/simple
script:
- pytest --cov-report xml --cov=. tests/
- coverage report --precision=2
coverage: '/\d+\.\d+%$/'
artifacts:
reports:
cobertura: coverage.xml

其中coverage report输出内容结构为:

1
2
3
4
5
6
Name    Stmts    Miss   Cover
-----------------------------
...
main.py 36 36 0%
-----------------------------
TOTAL 3130 3127 0.10%

正则匹配coverage,最终输出到UI的是最后一个匹配到的值0.10

下载coverage.xml的方法:进入CI/CD Pipelines页面,找到Job对应的Pipeline,最右边三个点,点击下载artifacts。

查看单测覆盖率的方法:进入CI/CD Pipelines页面,进入Job对应的Pipeline详情,点击Jobs,可以看到Coverage。

查看单测覆盖率的方法2:Job详情页,直接查看coverage report命令的输出内容。

单元测试和单元测试覆盖率,可以合并为一个stage:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
stages:
- unittest

unittest:
stage: unittest
image: python:3.7.10-slim-buster
before_script:
- pip install pytest pytest-cov -i https://pypi.tuna.tsinghua.edu.cn/simple
script:
#- export PYTHONPATH="$CI_PROJECT_DIR"
- pytest --junitxml=report.xml --cov-report xml --cov=. tests/
- coverage report --precision=2
coverage: '/\d+\.\d+%$/'
artifacts:
reports:
junit: report.xml
cobertura: coverage.xml

参考文档: