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.
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 :
- Jenkins : http://localhost:8080
- Artifactory : http://localhost:8081/artifactory (login/password : admin/password)
- Sonar : http://localhost:9000 (login/password : admin/admin)
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.
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.