16 Intégration continue
Une fois les règles de style, les conventions de typage et les outils de test définis, la prochaine étape logique consiste à automatiser leur exécution à chaque modification du code.
L’intégration continue permet de garantir que chaque modification respecte les règles de qualité et ne casse rien en cours de route. Elle automatise l’exécution :
- des linters (flake8, isort, etc.),
- des vérifications de type (mypy),
- des tests unitaires (avec couverture si possible),
- de la génération de documentation, ou du déploiement dans certains cas.
Elle repose généralement sur un système de pipeline (GitHub Actions, GitLab CI, CircleCI, etc.) déclenché à chaque push ou pull request.
Dans ce chapitre, nous verrons comment :
- Organiser le projet pour permettre une automatisation efficace,
- Configurer une pipeline simple de CI,
- Intégrer les outils existants (setup.cfg, tox, pytest, etc.),
- Et faire en sorte que ces vérifications soient un levier de qualité, plutôt qu’une contrainte supplémentaire.
16.1 setup.cfg
[flake8]
max-line-length = 100
exclude = .tox,.git,*/migrations/*,*/static/CACHE/*,docs,node_modules,venv
[pycodestyle]
max-line-length = 100
exclude = .tox,.git,*/migrations/*,*/static/CACHE/*,docs,node_modules,venv
[mypy]
python_version = 3.8
check_untyped_defs = True
ignore_missing_imports = True
warn_unused_ignores = True
warn_redundant_casts = True
warn_unused_configs = True
plugins = mypy_django_plugin.main
[mypy.plugins.django-stubs]
django_settings_module = config.settings.test
[mypy-*.migrations.*]
# Django migrations should not produce any errors:
ignore_errors = True
[coverage:run]
include = khana/*
omit = *migrations*, *tests*
plugins =
django_coverage_plugin