Gitlab CI: Pipeline maven

Le Gitlab CI intègre depuis la version 8.8 de Gitlab la notion de pipeline. C’est une notion très à la mode permettant de pouvoir séparer son processus de build en plusieurs étapes distinctes, interdépendantes et parallélisables.

Nous allons prendre ici l’exemple d’une application SpringBoot utilisant Maven et créer un pipeline de construction de l’application ayant le cheminement suivant

  • Construction de l’application
  • Tests unitaires
  • Tests de qualité de code (sonar)
  • Déploiement Nexus (SNAPSHOT)
  • Déploiement Nexus (release, branche master uniquement)

Préparation des Gitlab Runner (builders)

Dans un premier temps nous allons créer 2 répertoires partagés par nos runners pour nos builds maven

  • un répertoire .m2 qui contiendra la configuration maven standard pour nos builds
  • un répertoire tools qui contiendra notre script de release d’application Maven

mkdir -p /var/lib/gitlab-runner/.m2 /var/lib/gitlab-runner/tools

On configure ensuite le runner gitlab pour utiliser en read-only le .m2 et les outils. Editez le fichier /etc/gitlab-runner/config.toml:

Notre runner est pratiquement prêt, avant de le finir nous allons configurer le pipeline Maven afin que vous compreniez mieux la dernière phase.

Vous pouvez voir ici 2 choses sortant du commun:

  • un répertoire /.m2 provenant de l’hôte monté en read-only. Il portera notre configuration Maven (.m2/settings.xml), avec notre URL Nexus
  • un répertoire /tools lui aussi en read-only. Il contiendra certains scripts particuliers, notamment ici notre script de release Maven et la clef SSH privée permettant d’accéder en écriture au repository

Configuration du pipeline Maven

Notre pipeline maven s’appuie sur 5 étapes:

  • Construction de l’artefact
  • Tests
  • Déploiement dans Nexus
  • Génération de release
  • Documentation

Les étapes de documentation, déploiement Nexus et de génération de release ne seront effectuées que dans certaines conditions:

  • Déploiement dans Nexus: si nous construisons un snapshot, donc, ni sur un tag git, ni sur une branche nommée releases.
  • Génération de release: uniquement lors d’un commit sur la branche releases.
  • Documentation: uniquement lors d’un tag git

Afin de s’y retrouver, je vous propose de regarder le graphe suivant

Notre étape de tests est découpée en 2 tâches parallèles:

  • Tests unitaires et d’intégration
  • Tests sonar

Passons maintenant au fichier .gitlab-ci.yml que nous allons ajouter au repository:

Nous utilisons ici une image docker officielle contenant un builder Maven 3.3 et une JVM Java 8.

Gitlab 8.16 et inférieurs ne permettant pas de pousser depuis le CI nous allons devoir ruser en utilisant un script avec une clef privée spécifique d’édition des repositories. Je reviendrai plus tard sur la méthode pour Gitlab 9.0 et supérieurs.

Je vous propose de regarder le script ci-dessous:

Il s’agit ici de résoudre 2 problématiques:

  • concilier notre problème de push, en lisant la clef SSH privée de notre repository, en l’ajoutant à l’agent SSH du runner et en configurant notre commiter git.
  • ré-attacher le commit du build à sa branche, sinon Maven ne fonctionnera pas lors du release.

Enfin on pousse les tags générés par Maven et on pousse l’artefact vers Nexus. Le push du tag va déclencher un second pipeline générant automatiquement la documentation.

Conclusion

Nous avons vu ici comment utiliser efficacement le Gitlab CI pour construire une application standard Maven depuis Gitlab. Si vous utilisez Jenkins, Gitlab CI offre une alternative intéressante, notamment par des pipelines extrêmement flexibles, vous permettant de construire facilement des applications au moyen de conteneurs Docker, et donc reproductibles, avec des workspaces propres.

A vous de jouer !

Google Plus

One thought on “Gitlab CI: Pipeline maven

Laisser un commentaire

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