Recette de l’intégration continue facile et rapide

Le trio Jenkins, Artifactory et Sonar est un classique pour construire des projets, récupérer/déployer des artefacts et mesurer la qualité du code. Vous connaissez surement déjà ces trois outils, mais sauriez-vous les mettre en place vous-même en partant de zéro? La réponse est évidement Oui! Voici la recette.

docker-jenkins-artifactory-sonarqube

Ingrédients :

  • 1 Machine Linux 64 bit avec accès à internet
  • 1 pincée de savoir faire

Temps de préparation : 5mn

Difficulté : Facile

Préparation

Démarrez votre machine 64 bits, et assurez que la commande curl est déjà disponible ou faites en sorte qu'elle le soit.

curl --version

Ensuite installez docker puis docker-compose :

curl -sSL https://get.docker.com/ | sh
curl -L https://github.com/docker/compose/releases/download/1.5.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

Dans le répertoire de votre choix, créez un fichier docker-compose.yml et incorporez-y ceci :

# Un data volume docker pour conserver les fichiers Jenkins même en cas de redémarrage du conteneur
jenkins-data:
 image: jenkins:1.609.3
 volumes:
 - /var/jenkins_home
 entrypoint : /bin/true

# Le conteneur Jenkins
jenkins:
 image: jenkins:1.609.3
 ports:
 - "50000:50000"
 - "8080:8080"
 volumes_from:
 - jenkins-data
 links:
 - sonarqube-database
 - sonarqube
 - artifactory

# Un data volume docker pour conserver les fichiers Artifactory même en cas de redémarrage du conteneur
artifactory-data:
 image: jfrog-docker-registry.bintray.io/jfrog/artifactory-oss:4.1.3
 volumes:
 - /var/opt/jfrog/artifactory
 entrypoint : /bin/true


# Le conteneur Artifactory
artifactory:
 image: jfrog-docker-registry.bintray.io/jfrog/artifactory-oss:4.1.3
 ports:
 - "8081:8081"
 volumes_from:
 - artifactory-data

# Un data volume docker pour conserver la base de données Sonar même en cas de redémarrage du conteneur
sonarqube-database-data:
 image: postgres:9.4
 volumes:
 - /var/lib/postgresql/data
 entrypoint : /bin/true

# Une base de données pour Sonar
sonarqube-database:
 image: postgres:9.4
 volumes_from:
 - sonarqube-database-data
 environment:
 - POSTGRES_USER=sonar
 - POSTGRES_PASSWORD=sonar

# Un data volume docker pour conserver les fichiers Sonar même en cas de redémarrage du conteneur
sonarqube-data:
 image: sonarqube:5.1.1
 volumes:
 - /opt/sonarqube/extensions
 - /opt/sonarqube/logs
 entrypoint : /bin/true

# Et pour finir le conteneur Sonar
sonarqube:
 image: sonarqube:5.1.1
 ports:
 - "9000:9000"
 - "5432:5432"
 volumes_from:
 - sonarqube-data
 links:
 - sonarqube-database
 environment:
 - SONARQUBE_JDBC_USERNAME=sonar
 - SONARQUBE_JDBC_PASSWORD=sonar
 - SONARQUBE_JDBC_URL=jdbc:postgresql://sonarqube-database:5432/sonar

Toujours dans le même répertoire, lancez la commande :

docker-compose up

Laissez frémir quelques instants et voilà c'est prêt !

En supposant que localhost désigne votre hôte docker, vous avez accès aux trois applications :

Si la console vous rend la main avec un message du genre "Gracefully stopping...", c'est que la sauce n'a pas pris. Réessayez ! Ça finira bien par marcher.

Dégustation

Pour apprécier tout ça, on va par exemple construire un projet de type Java construit avec Maven, par exemple le projet commons-collection d'Apache Commons

Commencez par :

  • Installer Java ( Dans Jenkins : "Manage Jenkins" >  "Configure System" > "JDK" > "JDK installations" > "Add JDK" )
  • Installer Maven ( Dans Jenkins : "Manage Jenkins" >  "Configure System" > "Maven" > "Maven installations" > "Add Maven")
  • Installer le plugin "Config File Provider Plugin" ( Dans Jenkins : "Manage Jenkins" >  "Manage Plugins" > "Available" > "Config File Provider Plugin" > "Install without restart")

Ajoutez ce fichier de configuration maven ("Manage Jenkins" > "Managed files" > "Add a new config" > "Global Maven settings.xml" > "Content") :

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
 <profiles>
 <profile>
 <properties>
 <sonar.host.url>http://sonarqube:9000</sonar.host.url>
 <sonar.jdbc.url>jdbc:postgresql://sonarqube-database:5432/sonar</sonar.jdbc.url>
 <sonar.jdbc.username>sonar</sonar.jdbc.username>
 <sonar.jdbc.password>sonar</sonar.jdbc.password>
 </properties>
 <repositories>
 <repository>
 <snapshots>
 <enabled>false</enabled>
 </snapshots>
 <id>ph7docker-artifactory-releases</id>
 <name>libs-release</name>
 <url>http://artifactory:8081/artifactory/libs-release</url>
 </repository>
 </repositories>
 <id>artifactory</id>
 </profile>
 </profiles>
 <activeProfiles>
 <activeProfile>artifactory</activeProfile>
 </activeProfiles>
</settings>

Enfin, toujours sous Jenkins, créez  votre nouveau job de type Maven avec les paramètres suivants :

  • Repository URL de Subversion : http://svn.apache.org/repos/asf/commons/proper/collections/trunk/
  • Goals & Options maven : install sonar:sonar
  • Paramètres avancés du build : sous "Global Settings file" > "provided global settings.xml" sélectionnez le ficher de configuration Maven créé précédemment
  • Dans Sonar, parmi les "Globals settings", mettez l'option "Disable the SCM Sensor" à true sans quoi l'opération "SVN blame" de sonar va échouer car vous n'avez qu'un accès anonyme au svn.

Enregistrez et lancez le build.

Bravo ! Le projet compile en tirant les dépendances depuis votre Artifactory et les métriques sont poussées sur sonar : http://localhost:9000.

Sonar Apache commons-collections

 

Variantes

Remplacez Linux par Windows ou Mac OS.

Ajoutez Git ou SVN en amont

Lancez vos conteneurs docker en tant que démons avec la commande docker-compose up -d

Jouez avec le paramètre docker always-restart pour (re)démarrer automatiquement vos conteneurs.

 

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.