Как организовать мой git репозиторий с зависимостями? - PullRequest
1 голос
/ 29 марта 2020

Я использую автономный экземпляр GitLab с несколькими Python проектами. Все эти проекты теперь имеют конвейер, который выполняет несколько Py-линтеров и анализаторов состояния c У бегунов gitlab установлено python3, включая необходимые пакеты / линтеры. Таким образом, бегуны грешно выполняют:

$ python3 -m pylint project_foo
$ python3 -m pylint project_bar

Если я когда-нибудь захочу использовать другую версию линтера, мне нужно будет «обновить» все проекты, так как установлен только системный линтер. Теперь у меня есть два варианта.

  1. Я отправляю все модули, необходимые для конвейера, также в репозиторий
  2. Я использую Python виртуальные среды
  3. Еще одна идея?

Я ищу кого-то, кто мог бы поделиться некоторым опытом

1 Ответ

1 голос
/ 29 марта 2020

Я бы рекомендовал использовать исполнителей на основе контейнеров , т.е. 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

Вы можете создать собственное изображение с указанными вами c tools \ configs \ prerequisites \ dependencies \ environment и использую его, но я предпочитаю не слишком. Как еще одно преимущество такого подхода - вы также тестируете установку тех, что является лучшей практикой в ​​непрерывной доставке.

Что касается python линтеров - я решил использовать несколько в то же время, поскольку они охватывают различные аспекты качества, и я в основном запускаю их через ловушки предварительной фиксации , которые я также выполняю в CI GitLab на случай, если разработчик забудет установить ловушки локально.

Пример урезанного .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, который запускает предварительную фиксацию, а также другие линтеры python:

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

...