我正在将自托管的GitLab实例用于多个Python项目。现在,所有这些项目都有执行多个Py linter和静态分析器的管道。 gitlab运行程序已安装?- length(B, 3),
forall(bits(B),
format('~q~n', [B])).
[x,x,x]
[x,x,o]
[x,o,x]
[x,o,o]
[o,x,x]
[o,x,o]
[o,o,x]
[o,o,o]
,包括必需的程序包/填充物。因此,跑步者会敏锐地执行:
python3
如果我想使用另一个Linter版本,则由于所有安装的系统Linter,都需要“更新”所有项目。我现在有两个选择。
我正在寻找可以分享经验的人
答案 0 :(得分:1)
我建议使用基于容器的执行器,即Docker或Kubernetes:https://docs.gitlab.com/runner/executors/README.html
然后在管道的每个作业中,为该作业选择正确的Docker映像。
它使您可以灵活地使用任何python版本,甚至可以使用Docker Hub上数以百万计的任何图像。
您需要为在正式映像之上运行的每项作业安装依赖项或工具,这会增加构建时间。
run_script:
image: python:3
script:
- pip3 install pipenv
- pipenv install
- pipenv run ./my_beautiful_script.py
您可以使用特定的工具\ configs \ prerequisites \ dependencies \ environment创建自定义图像并使用它,但我也不太喜欢。这种方法的另一个好处是-您还可以测试它们的安装,这是持续交付中的最佳做法。
关于 python linters -我选择同时使用其中的几个,因为它们涵盖了质量的不同方面,我主要通过pre-commit hooks运行它们,如果开发人员忘记在本地安装钩子,也可以在GitLab CI中执行。
剥离.pre-commit-config.yaml
的示例:
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v2.5.0
hooks:
- id: check-yaml
- repo: https://gitlab.com/pycqa/flake8
rev: 3.7.9
hooks:
- id: flake8
- repo: https://github.com/pre-commit/mirrors-autopep8
rev: v1.5
hooks:
- id: autopep8
args: [--diff]
- repo: https://github.com/asottile/pyupgrade
rev: v2.1.0
hooks:
- id: pyupgrade
和.gitlab-ci.yml
可以运行pre-commit和其他python linter:
python-lint:
image: python:3
script:
- pip3 -q install pre-commit pycodestyle pylint
- pre-commit run -a
- pycodestyle --version
- pycodestyle --verbose --show-source *.py
- pylint --version
- find . -name "*.py" -print0 | xargs -0 pylint
在我用于所有与python相关的代码的模板项目中查看完整文件:https://gitlab.com/softmill/template-projects/python