Intégration continue avec Gitlab+Jenkins et des Jenkinsfiles

Gitlab permet de se brancher avec Jenkins pour y faire l’intégration continue.

Contexte

En l’occurrence, Jenkins était déjà bien établi et utilisé, avec des jobs de build, release, packaging et déploiement configurés en mode dit « free-style » de Jenkins. Ainsi que des pipelines Jenkins permettant d’en enchaîner certains, quelques jobs spécifiques Windows etc. Bref, pas facile a priori de passer sur le CI de Gitlab : le choix a été de rester sur Jenkins, au moins dans un premier temps.

Mais la configuration de ces jobs Jenkins est lourde à maintenir à la main via l’interface web (car il y en a beaucoup). Dans certains cas, on peut gagner du temps en éditant les fichiers XML de configuration des jobs, mais ce n’est pas idéal non plus, entre autres parce que cette configuration n’est pas versionnée.

L’idée est donc de configurer les jobs via des fichiers Jenkinsfile, commités en gestion de conf dans chaque projet.

Configuration de Jenkins

Il est possible d’éditer chacun des jobs existant pour leur dire d’utiliser le Jenkinsfile, mais il y a plus simple : le plugin Jenkins « Gitlab Branch Source » (https://plugins.jenkins.io/gitlab-branch-source) permet de créer automatiquement les jobs de chaque projet.

On crée un unique job avec ce plugin, configuré sur un groupe gitlab. Il scanne les projets de ce groupe, et crée un job pour chaque projet dans lequel il trouve un Jenkinsfile.

Pour les différents types de job, il suffit de créer des fichiers Jenkinsfile spécifiques. Par exemple Jenkinsfile pour le build, Jenkinsfile-deploy pour lancer un déploiement, Jenkinsfile-release pour lancer une release.

Configuration de Gitlab

Il faut configurer gitlab pour qu’il déclenche un build lors de chaque Merge Request.

Il suffit pour cela de configurer un webhook avec Jenkins. J’ai décrit (et scripté) ça dans un précédent article de blog.

Ca fonctionne plutôt bien, malgré un délai important de mise à jour de l’interface web de gitlab concernant le statut du build Jenkins.

Je suis par contre tombé sur un petit bug, que j’ai rapporté : https://issues.jenkins-ci.org/browse/JENKINS-59882. Si on a configuré des paramètres dans le Jenkinsfile, ils ne sont pas pris en compte lors du premier build (qui ne demande pas de paramètres). Pas de souci pour tous les builds suivants : Jenkins demande et passe les paramètres. Comme contournement, j’ai contrôlé qu’au moins un des paramètres était renseigné dans le Jenkinsfile, donc le premier build plante « proprement » dès le début.

Résultat

Plus besoin de créer/maintenir les jobs Jenkins, ils sont créés dynamiquement.

La configuration de ces jobs est stockée avec le code source, donc versionnée, et potentiellement différente entre les branches.

Laisser un commentaire

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