Contactez-nous

Identifier et comprendre les échecs de build

Maîtrisez le diagnostic des échecs de build dans Jenkins. Apprenez à lire les logs, résoudre les erreurs SCM, les commandes non trouvées et les tests échoués pour des pipelines CI/CD robustes.

Décrypter la console Jenkins : première étape vers la résolution d'échecs

Lorsqu'un build Jenkins échoue, la première et la plus cruciale des actions est de consulter la sortie console. C'est votre journal de bord, enregistrant chaque étape, chaque commande exécutée, et surtout, chaque message d'erreur qui pourrait expliquer l'échec. Savoir naviguer et interpréter ces informations est une compétence fondamentale pour tout utilisateur de Jenkins. Ne considérez pas un build rouge comme une fatalité, mais plutôt comme un puzzle à résoudre, dont la console détient les premières pièces.

Pour accéder à la sortie console d'un build spécifique, naviguez jusqu'à la page du job concerné, puis cliquez sur le numéro du build en échec dans l'historique des builds. Vous y trouverez un lien "Console Output" ou "Sortie de la console". Cette page affiche un flux de texte, souvent chronologique. Apprenez à repérer les mots-clés indicateurs tels que ERROR, FAILURE, WARNING, ou des traces d'appels (stack traces) qui pointent souvent vers l'origine du problème. Il est fréquent que l'erreur fatale se trouve vers la fin du log, mais les causes premières peuvent être signalées bien plus haut.

L'interprétation des messages d'erreur demande de la pratique. Commencez par lire attentivement le message d'erreur principal. S'il s'agit d'une trace d'appel (stack trace), typique des applications Java ou d'autres langages, essayez d'identifier la ligne de code ou le composant qui a déclenché l'exception. Faites attention au contexte : quelle étape du pipeline était en cours d'exécution ? Quelle commande a été lancée juste avant l'erreur ? Parfois, un message d'avertissement (warning) antérieur peut donner un indice sur un problème sous-jacent qui a conduit à l'échec final. N'hésitez pas à remonter dans le log pour comprendre la séquence des événements.

Problème courant : erreur de checkout SCM (mauvaise URL, credentials)

Une source fréquente d'échecs, surtout lors de la configuration initiale d'un job, est l'incapacité de Jenkins à récupérer le code source depuis votre système de gestion de version (SCM), comme Git. Ces erreurs de "checkout" peuvent avoir plusieurs origines, souvent liées à une mauvaise configuration de l'URL du dépôt ou à des problèmes d'authentification.

L'une des causes les plus simples est une erreur dans l'URL du dépôt. Une faute de frappe, un protocole incorrect (http au lieu de https ou ssh), ou un nom de dépôt inexact peuvent empêcher Jenkins de localiser votre code. Un message d'erreur typique pourrait ressembler à ceci dans la console :

ERROR: Error fetching remote repo 'origin'
Caused by: hudson.plugins.git.GitException: Failed to fetch from https://githost.com/user/myrepoo.git
Caused by: org.eclipse.jgit.api.errors.TransportException: https://githost.com/user/myrepoo.git: not found
... ou ...
stderr: remote: Repository not found.
fatal: repository 'https://githost.com/user/myrepoo.git' not found

Vérifiez méticuleusement l'URL configurée dans votre job Jenkins et comparez-la avec celle fournie par votre plateforme SCM (GitHub, GitLab, Bitbucket, etc.).

Les problèmes d'identifiants (credentials) sont également courants. Si votre dépôt est privé, Jenkins a besoin des permissions adéquates pour y accéder. Cela peut impliquer un couple nom d'utilisateur/mot de passe, un token d'accès personnel, ou une clé SSH. Une erreur typique liée aux credentials pourrait être :

ERROR: Couldn't find any revision to build. Verify the repository and branch configuration for this job.
... ou ...
Failed to connect to repository : Command "git ls-remote -h -- ssh://git@githost.com/user/myrepo.git HEAD" returned status code 128:
stdout:
stderr: Permission denied (publickey).
fatal: Could not read from remote repository.

Please ensure you have the correct access rights
and the repository exists.

Assurez-vous que les bons identifiants sont stockés dans le gestionnaire de "Credentials" de Jenkins et qu'ils sont correctement sélectionnés dans la configuration SCM de votre job. Pour les accès SSH, vérifiez que la clé publique est bien ajoutée à votre compte SCM et que la clé privée est correctement configurée dans Jenkins.

Problème courant : commande non trouvée (outil manquant sur l'agent)

Une autre catégorie d'erreurs survient lorsque Jenkins tente d'exécuter une commande (comme mvn, npm, docker, python, etc.) nécessaire à votre processus de build, mais que cette commande n'est pas disponible ou accessible sur l'agent (noeud) qui exécute le job. Jenkins lui-même ne fournit pas ces outils ; ils doivent être installés sur la machine (master ou agent dédié) où le build s'exécute.

Le message d'erreur est généralement explicite et indique clairement quelle commande fait défaut. Par exemple, vous pourriez voir :

/tmp/jenkins-script.sh: line 2: mvn: command not found
Build step 'Execute shell' marked build as failure

Ou encore pour un projet Node.js :

/tmp/jenkins-script.sh: line 3: npm: command not found
Build step 'Execute shell' marked build as failure

Pour résoudre ce problème, plusieurs pistes sont à explorer. Premièrement, vérifiez que l'outil en question (Maven, Node.js, Docker, etc.) est bien installé sur l'agent concerné. Deuxièmement, assurez-vous que le répertoire contenant l'exécutable de l'outil est inclus dans la variable d'environnement PATH de l'utilisateur sous lequel Jenkins exécute les builds sur cet agent. Si vous utilisez des agents spécifiques pour différents types de projets, confirmez que le job s'exécute sur un agent correctement outillé.

Dans un Jenkinsfile, vous pouvez souvent spécifier des outils à l'aide de la directive tools, si des configurations d'outils ont été définies globalement dans Jenkins (Manage Jenkins > Global Tool Configuration). Par exemple :

pipeline {
    agent any
    tools {
        maven 'Maven3.6.3' // 'Maven3.6.3' doit correspondre à un nom configuré dans Jenkins
        jdk 'JDK8'        // 'JDK8' doit correspondre à un nom configuré dans Jenkins
    }
    stages {
        stage('Build') {
            steps {
                sh 'mvn clean install'
            }
        }
    }
}

Cette approche permet à Jenkins de s'assurer que les versions spécifiées des outils sont disponibles dans le PATH pour l'exécution du pipeline.

Problème courant : échec des tests et comment investiguer

L'échec des tests automatisés est une indication que quelque chose ne va pas avec votre code ou votre configuration. Jenkins, en tant qu'intégrateur, se contente souvent de rapporter les résultats fournis par vos outils de test (JUnit, TestNG, Jest, PyTest, etc.). Un build marqué comme "échoué" à cause de tests signifie généralement qu'un ou plusieurs cas de test n'ont pas produit le résultat attendu.

La première étape est d'examiner la sortie console pour identifier quels tests ont échoué. Les frameworks de test fournissent généralement des rapports détaillés. Jenkins, grâce à des plugins comme le "JUnit Plugin", peut agréger ces résultats et les présenter de manière conviviale sur la page du build. Cherchez une section "Test Result" ou similaire. Vous y verrez le nombre total de tests, le nombre d'échecs, et souvent la liste des tests défaillants avec les messages d'erreur spécifiques.

Par exemple, pour un test JUnit échoué, vous pourriez voir dans la console quelque chose comme :

Tests run: 5, Failures: 1, Errors: 0, Skipped: 0

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.2:test (default-test) on project my-app: There are test failures.

[INFO] Please refer to /path/to/your/project/target/surefire-reports for the individual test results.
[INFO] Please refer to dump files (if any) here: /path/to/your/project/target/surefire-reports-dump.log

Le message vous invite souvent à consulter des rapports plus détaillés (ici, les rapports Surefire pour un projet Maven). Ces rapports (souvent des fichiers XML ou HTML) contiennent des informations précises sur la cause de l'échec de chaque test : une assertion non vérifiée, une exception inattendue, etc. N'hésitez pas à consulter ces fichiers directement sur l'agent ou via les artefacts archivés par Jenkins si configuré.

Pour investiguer plus profondément, essayez de reproduire l'échec localement sur votre machine de développement avec la même version du code. Cela permet un débogage plus interactif. Analysez les logs de l'application générés pendant l'exécution des tests sur Jenkins ; ils peuvent contenir des indices précieux. Enfin, soyez conscient des tests "floconneux" (flaky tests) : ceux qui échouent de manière intermittente sans changement de code. Ils sont particulièrement difficiles à diagnostiquer et peuvent nécessiter une refonte du test ou une analyse de l'environnement d'exécution.