Makina Blog

Le blog Makina-corpus

Django et Jenkins


Lors des Recontres Django 2011, Nicolas Perriault a présenté les principes de l'intégration continue avec Django, Jenkins, et … django-jenkins !

Lors des Recontres Django 2011, Nicolas Perriault a présenté les principes de l'intégration continue avec Django, Jenkins, et … django-jenkins !

Pour qu'un projet django soit testé facilement, il doit se déployer et se lancer facilement ! C'est certes l'occasion de peaufiner l'automatisation, mais ce n'est pas toujours évident quand il y a du geodjango, du celery … Je vais tenter de partager mes notes dans ce billet.

Le minimum requis

Pour l'installation de Jenkins, rien de plus simple (sur debian)

sudo aptitude install jenkins

Mais il va falloir lui donner de quoi télécharger votre code sur git et parfois compiler les librairies python nécessaires

sudo aptitude install git-core
sudo aptitude install python-dev build-essential python-virtualenv

Les plugins Jenkins indispensables :

  • covertura
  • Violations
  • GIT
  • Green Balls
  • Continuous Integration Game

Organisation du projet Django

Dans ce billet, j'utilise pip, comme beaucoup de djangonautes. Je présenterai la même chose avec buildout dans un autre billet.
  • Définition des dépendances globales dans requirements.txt

    Django>=1.3
    south
    
  • Définition des dépendances liées aux tests dans requirements-testing.txt

    django-jenkins
    
  • Ajout d'un fichier pylint.rc pour régler les niveaux d'alerte PEP-8

    [MESSAGES CONTROL]
    disable=E1101,E1103,C0111,I0011,I0012,W0704,W0142,W0212,W0232,W0613,W0702,R0201
    ...
    ...
    
  • Modèle de settings de tests dans project/test_settings.py

from default_settings import *
DEBUG = True
TEMPLATE_DEBUG = DEBUG

INSTALLED_APPS += (
    'django_jenkins',
)
PYLINT_RCFILE = os.path.join(PROJECT_ROOT_PATH, '..', 'conf', 'pylint.rc')

Configuration du job Jenkins

Les informations de la présentation de Nicolas suffisent pour démarrer.

J'ai noté cependant qu'il fallait lancer manage.py depuis un répertoire parent au projet pour que l'exploration du code source fonctionne.

Pour profiter de la magie des ingrédients précédents, nous aurons donc juste à ajouter un bloc script shell, qui installe les dépendances listées, pose les settings de test et migre la base (avec South):

#!/bin/bash -ex
virtualenv --quiet ve
source ./ve/bin/activate
pip install -E ./ve -r $WORKSPACE/requirements.txt
pip install -E ./ve -r $WORKSPACE/requirements-testing.txt
cp $WORKSPACE/project/test_settings.py $WORKSPACE/project/local_settings.py
python $WORKSPACE/project/manage.py syncdb --noinput
python $WORKSPACE/project/manage.py migrate
deactivate

et celui-ci pour lancer les tests proprements dits :

#!/bin/bash -ex
virtualenv --quiet ve
source ./ve/bin/activate
python $WORKSPACE/project/manage.py jenkins yourapps
deactivate

Pour un projet SIG

Il faut installer certaines librairies SIG sur le serveur Jenkins.

sudo aptitude install libproj0 libgeos-c1

Si le besoin de cloisonner ces librairies pour chaque projet se fait ressentir, il faut utiliser des outils comme minitage.

Spatialite au lieu de PostGIS comme base de tests

sudo aptitude install python-sqlite libspatialite2 sqlite3

Script d'initialisation

wget http://www.gaia-gis.it/spatialite/init_spatialite-2.3.zip -O /tmp/init_spatialite-2.3.zip
cd /usr/local/lib/
sudo unzip /tmp/init_spatialite-2.3.zip

avec dans test_settings.py

DATABASES = {
'default': {
    'ENGINE': 'django.contrib.gis.db.backends.spatialite',
    ...
    ...
SPATIALITE_SQL=os.path.join('usr', 'local', 'lib', 'init_spatialite-2.3.sql')

Si pysqlite n'a pas été compilé avec les extensions C (Erreur: The pysqlite library does not support C extension loading.) il faut recompiler !

sudo aptitude install libsqlite3-dev
wget http://pysqlite.googlecode.com/files/pysqlite-2.6.3.tar.gz
tar -zxvf pysqlite-2.6.3.tar.gz
cd pysqlite-2.6.3
sed -i s/define=SQLITE_OMIT_LOAD_EXTENSION/#define=SQLITE_OMIT_LOAD_EXTENSION/g setup.cfg

source ./ve/bin/activate
python setup.py install

Pour un projet Celery

Kombu au lieu de RabbitMQ comme gestionnaire de messages

requirements-testing.txt

kombu
djkombu

test_settings.py

INSTALLED_APPS += (
    'djkombu',
)
CARROT_BACKEND = "django"

Pour désactiver la parallélisation lors des tests

CELERY_ALWAYS_EAGER = True

Formations associées

Formations Django

Formation Django initiation

Nantes Du 12 au 14 mars 2024

Voir la formation

Formations Django

Formation Django avancé

À distance (FOAD) Du 9 au 13 décembre 2024

Voir la formation

Formations Django

Formation Django intégration

À distance (FOAD) 11 mai

Voir la formation

Actualités en lien

Image
Article SIG cartographie : Géné­rer un fichier PMTiles à partir d’un MBTiles
24/04/2024

Géné­rer un fichier PMTiles à partir d’un MBTiles

Exemple de conver­sion d’une base de tuiles vecto­rielles MBTiles du Plan Cadas­tral Infor­ma­tisé vers le format PMTiles (Proto­maps).

Voir l'article
Image
Capture d'une partie de carte montrant un réseau de voies sur un fond de carte sombre. Au centre, une popup affiche les information de l'un des tronçons du réseau.
28/02/2024

Géné­rer un fichier PMTiles avec Tippe­ca­noe

Exemple de géné­ra­tion et d’af­fi­chage d’un jeu de tuiles vecto­rielles en PMTiles à partir de données publiques.

Voir l'article
Image
Encart article Protomaps : Illustration d'une portion de pyramide de tuiles
14/02/2024

Protomaps, stockez vos pyramides de tuiles plus simplement

Présentation d'un nouveau format de stockage de tuiles cartographiques

Voir l'article

Inscription à la newsletter

Nous vous avons convaincus