Un exemple d'intégration continue avec Gitlab

Publié le 05/08/2016

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):

# 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:

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:

  1. Les dépendances sont installées,
  2. Les tests sont lancés
  3. 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.