J’ai récemment créé un nouveau projet sur Framagit, qui propose une des dernières versions de Gitlab, avec son module d’intégration continue. Cela devient juste super facile de mettre un process d’intégration continue sur son projet ❤️.
Pour mon projet Django, j’ai ajouté deux dépendances dans un fichier requirements/dev.txt
(bon, trois, avec Django):
coverage
django_coverage_plugin
# requirements/base.txt
django
# requirements/dev.txt
-r base.txt
coverage
django_coverage_plugin
On crée ensuite un fichier .gitlab-ci.yml
à la racine du projet, avec le contenu suivant:
before_script:
- pip install -r requirements/dev.txt
test:python-3.4:
stage: test
image: python:3.4-slim
script:
- coverage run src/manage.py test sherlock
- coverage report -m
Les paramètres importants sont:
- L’
image
qui spécifie l’image Docker à utiliser (sans quoi les binairespython
pourraient par exemple ne pas être disponibles, et pourraient devoir être installé avec le gestionnaire de paquet de la distribution sur laquelle l’image se base). En fonction du langage utilisé, choisissez une autre image. - Et la partie
script
. Ici,sherlock
est le nom de mon application Django; elle se situe dans le sous-répertoiresrc/
.
En bonus #
Pour avoir le pourcentage de couverture de code, ajoutez, dans les paramètres du projet, la valeur \d+\%\s*$
à l’option test coverage parsing
.
Au niveau du fichier README.md
, ajoutez le contenu suivant: [![build status](https://framagit.org/Grimbox/heima/badges/master/build.svg)](https://framagit.org/Grimbox/heima/commits/master)
Résultat #
Résultat:
- Les dépendances sont installées,
- Les tests sont lancés
- La couverture de code indique un pourcentage qui est récupérée au passage par la regex ci-dessus.
Magique: on a alors un petit badge de réussite sur la page d’accueil, et le pourcentage de couverture de code indiquée sur les tests. Tout va bien.
Running with gitlab-ci-multi-runner 1.4.1 (fae8f18)
Using Docker executor with image python:3.4-slim ...
Pulling docker image python:3.4-slim ...
Running on runner-ed7dbd37-project-7675-concurrent-0 via ruth...
Fetching changes...
HEAD is now at ff9e6aa add coverage
From https://framagit.org/Grimbox/heima
+ ff9e6aa...aaf716d master -> origin/master (forced update)
Checking out aaf716d6 as master...
$ pip install -r requirements/dev.txt
Collecting django (from -r requirements/base.txt (line 1))
Downloading Django-1.10-py2.py3-none-any.whl (6.8MB)
Collecting coverage (from -r requirements/dev.txt (line 2))
Downloading coverage-4.2.tar.gz (359kB)
Collecting django_coverage_plugin (from -r requirements/dev.txt (line 3))
Downloading django_coverage_plugin-1.3.1.tar.gz
Collecting six>=1.4.0 (from django_coverage_plugin->-r requirements/dev.txt (line 3))
Downloading six-1.10.0-py2.py3-none-any.whl
Installing collected packages: django, coverage, six, django-coverage-plugin
Running setup.py install for coverage: started
Running setup.py install for coverage: finished with status done
Running setup.py install for django-coverage-plugin: started
Running setup.py install for django-coverage-plugin: finished with status done
Successfully installed coverage-4.2 django-1.10 django-coverage-plugin-1.3.1 six-1.10.0
$ coverage run src/manage.py test sherlock
....
----------------------------------------------------------------------
Ran 4 tests in 0.024s
OK
Creating test database for alias default...
Destroying test database for alias default...
$ coverage report -m
Name Stmts Miss Cover Missing
-----------------------------------------------------------------------
src/heima/__init__.py 0 0 100%
src/heima/settings.py 18 0 100%
src/manage.py 13 6 54% 9-21
src/sherlock/__init__.py 0 0 100%
src/sherlock/admin.py 8 0 100%
src/sherlock/migrations/0001_initial.py 7 0 100%
src/sherlock/migrations/__init__.py 0 0 100%
src/sherlock/models.py 18 0 100%
src/sherlock/tests.py 30 0 100%
-----------------------------------------------------------------------
TOTAL 94 6 94%
Build succeeded
Intégration avec Flake8 #
[Update du 08/08/2016]
Toujours dans la même veine, on peut pousser l’intégration avec Flake8. Il suffit d’ajouter flake8
dans les prérequis, ainsi qu’un fichier .tox.ini
dans lequel on trouvera le contenu suivant:
[flake8]
max-line-length = 100
exclude = migrations, manage.py
On modifie ensuite le fichier .gitlab-ci.yml
pour y ajouter l’intégration flake8
:
before_script:
- pip install -r requirements/dev.txt
test:python-3.4:
stage: test
image: python:3.4-slim
script:
- flake8 src/ <-- ici -->
- coverage run src/manage.py test sherlock
- coverage report -m
Attention que si flake8
renvoie le moindre avertissement, le processus d’intégration continue du projet passera en failed.