Dépannage rapide des échecs de construction avec l'interface CLI de Jenkins
Jenkins est l'épine dorsale des pipelines d'intégration continue et de livraison continue (CI/CD) pour d'innombrables organisations. Bien qu'il automatise les processus de construction, de test et de déploiement, les échecs de construction font inévitablement partie du développement logiciel. Lorsqu'une construction échoue, un diagnostic et une résolution rapides sont essentiels pour minimiser les temps d'arrêt et maintenir l'avancement du développement.
Bien que l'interface utilisateur Web de Jenkins fournisse des informations exhaustives, le moyen le plus rapide de dépanner est parfois directement via l'interface de ligne de commande (CLI) de Jenkins. La CLI offre une alternative puissante, scriptable et souvent plus rapide à la navigation dans l'interface utilisateur, en particulier pour les tâches répétitives ou lors du traitement de nombreux journaux de construction.
Ce guide vous expliquera comment exploiter la CLI de Jenkins pour diagnostiquer rapidement les échecs de construction, récupérer les journaux détaillés, inspecter les variables d'environnement et redémarrer efficacement les constructions.
Pourquoi utiliser la CLI de Jenkins pour le dépannage ?
La CLI de Jenkins offre plusieurs avantages pour le dépannage :
- Vitesse : Récupérez rapidement les journaux et les informations sans navigation par navigateur.
- Automatisation : Intégrez les étapes de dépannage dans des scripts ou des rapports automatisés.
- Accès à distance : Effectuez des diagnostics depuis n'importe quel terminal ayant un accès réseau à votre instance Jenkins.
- Efficacité : Filtrez les journaux et les informations à l'aide d'outils shell standard tels que
grep,awketsed.
Prérequis
Avant de pouvoir commencer le dépannage avec la CLI de Jenkins, assurez-vous d'avoir ce qui suit :
- Serveur Jenkins en cours d'exécution : Une instance Jenkins active à laquelle vous avez un accès administratif.
- JAR de la CLI Jenkins : Téléchargez le fichier
jenkins-cli.jarà partir de votre instance Jenkins. Vous pouvez généralement le trouver à l'adresseJENKINS_URL/jnlpJars/jenkins-cli.jar. - Authentification : La CLI nécessite une authentification. La méthode recommandée consiste à utiliser un jeton API pour un utilisateur Jenkins. Générez un jeton API via
Nom_Utilisateur -> Configure -> Ajouter un nouveau jeton.
Configuration de la CLI
Tout d'abord, téléchargez le jenkins-cli.jar :
wget JENKINS_URL/jnlpJars/jenkins-cli.jar
# Ou en utilisant curl
curl -O JENKINS_URL/jnlpJars/jenkins-cli.jar
Pour simplifier les commandes, vous pouvez définir des variables d'environnement pour votre URL Jenkins, votre nom d'utilisateur et votre jeton API :
export JENKINS_URL="http://your-jenkins-instance.com"
export JENKINS_USER="your_username"
export JENKINS_API_TOKEN="your_api_token"
# Aliassez la commande CLI pour plus de commodité
alias jcli='java -jar jenkins-cli.jar -s "$JENKINS_URL" -auth "$JENKINS_USER:$JENKINS_API_TOKEN"'
Maintenant, vous pouvez simplement utiliser jcli suivi de la commande.
Identification des constructions ayant échoué
La première étape du dépannage consiste à identifier quelle tâche et quelle construction ont échoué. Bien que la CLI ne dispose pas d'une commande directe pour lister uniquement les constructions ayant échoué, vous pouvez lister les tâches, puis les inspecter, ou utiliser Groovy pour un filtrage plus avancé.
Liste des tâches
Pour voir une liste de toutes les tâches sur votre instance Jenkins :
jcli list-jobs
Ceci fournit une liste de base. Pour obtenir des informations plus détaillées sur une tâche spécifique, y compris l'état de sa dernière construction, utilisez get-job :
jcli get-job MyPipelineJob
Le résultat (au format XML par défaut) contiendra des informations telles que lastFailedBuild, lastSuccessfulBuild, etc., que vous pourrez analyser.
Astuce : Utilisation de Groovy pour un filtrage avancé
Pour un filtrage plus avancé, en particulier pour trouver des constructions ayant échoué spécifiques, vous pouvez exécuter des scripts Groovy via la CLI. C'est incroyablement puissant.
jcli groovy =
'Jenkins.instance.getAllItems(hudson.model.Job.class).each { job ->
def lastBuild = job.getLastBuild()
if (lastBuild != null && lastBuild.result == hudson.model.Result.FAILURE) {
println "Failed Job: ${job.name}, Build: ${lastBuild.number}"
}
}'
Récupération des journaux de construction détaillés
L'étape la plus courante et la plus cruciale du dépannage est l'examen des journaux de construction (sortie console). La CLI de Jenkins rend cela simple.
Obtention de la sortie console
Pour récupérer l'intégralité de la sortie console d'une construction spécifique, utilisez la commande console :
jcli console MyPipelineJob 123
Remplacez MyPipelineJob par le nom de votre tâche et 123 par le numéro de construction. Cela déversera le journal entier dans votre terminal.
Filtrage des journaux pour les erreurs
Lorsque les journaux sont volumineux, leur analyse manuelle est inefficace. Exploitez grep pour trouver rapidement les messages d'erreur pertinents, les traces de pile ou les mots-clés.
jcli console MyPipelineJob 123 | grep -iE "error|fail|exception|stacktrace"
-i: Ignorer la casse.-E: Utiliser des expressions régulières étendues (permet|pour OU).
Cette commande réduit considérablement la sortie, vous aidant à identifier plus rapidement la cause de l'échec.
Surveillance des constructions en direct
Pour les constructions qui sont toujours en cours d'exécution mais qui semblent bloquées ou échouent lentement, vous pouvez surveiller leur sortie console en temps réel, similaire à tail -f :
jcli console MyPipelineJob LAST_BUILD_NUMBER --follow
Ceci diffusera continuellement les nouvelles entrées de journal au fur et à mesure de leur apparition, jusqu'à ce que la construction se termine ou que vous arrêtiez la commande.
Inspection des variables d'environnement de construction
Les variables d'environnement jouent souvent un rôle essentiel dans l'exécution de la construction, influençant les chemins, les secrets et la configuration. Des variables d'environnement incorrectes ou manquantes peuvent entraîner des échecs de construction. Bien qu'il n'y ait pas de commande CLI directe pour répertorier toutes les variables d'environnement d'une construction passée, vous pouvez les récupérer à l'aide d'un script Groovy exécuté via la CLI.
Assurez-vous d'abord que votre pipeline imprime explicitement les variables d'environnement pertinentes ou que vous avez accès à une étape dumpEnvVars (si vous utilisez le plugin Pipeline Utility Steps). Sinon, vous pouvez utiliser Groovy.
Utilisation de Groovy pour accéder aux variables d'environnement
jcli groovy =
'def job = Jenkins.instance.getItemByFullName("MyPipelineJob")
def build = job.getBuildByNumber(123)
if (build) {
build.getEnvironment().each { key, value ->
println "${key}=${value}"
}
} else {
println "Build 123 not found for MyPipelineJob"
}'
Ce script se connecte à l'API Jenkins, récupère la tâche et la construction spécifiées, puis itère et imprime toutes les variables d'environnement qui ont été définies pendant l'exécution de cette construction.
- Avertissement de sécurité : Soyez prudent lorsque vous imprimez des variables d'environnement, car elles peuvent contenir des informations sensibles (clés API, mots de passe, etc.). Ne le faites que dans des environnements sécurisés et assurez-vous d'un contrôle d'accès approprié.
Analyse des échecs spécifiques aux étapes dans les pipelines
Pour les pipelines Jenkins, savoir quelle étape a échoué est crucial. Bien que la sortie console brute affiche les marqueurs [Pipeline] stage, qui aident à délimiter les étapes, la CLI elle-même ne fournit pas de manière structurée pour interroger directement l'état de l'étape comme le fait l'interface utilisateur (par exemple, Blue Ocean).
Localisation des échecs d'étape dans les journaux
Lors de l'examen de la sortie console, recherchez la dernière entrée [Pipeline] stage avant le message d'erreur ou la trace de pile. Cela indique généralement l'étape où l'échec s'est produit.
jcli console MyPipelineJob 123 | less
À l'intérieur de less, vous pouvez rechercher [Pipeline] stage puis faire défiler pour trouver l'erreur.
Réexécution ou redémarrage des constructions ayant échoué
Une fois que vous avez identifié la cause première d'un échec et appliqué une correction (par exemple, poussé de nouveau code, mis à jour une configuration), vous voudrez réexécuter la construction. La CLI offre un moyen simple de le faire.
Réexécuter une construction entière
Pour déclencher une nouvelle construction pour une tâche :
jcli build MyPipelineJob
Si votre tâche accepte des paramètres, vous pouvez les passer en utilisant l'indicateur -p :
jcli build MyPipelineJob -p BRANCH=feature/fix-bug -p BUILD_VERSION=1.0.1
--wait(-s) : Attendre que la construction soit terminée.--verbose(-v) : Afficher la progression et les journaux de construction.
jcli build MyPipelineJob -p BRANCH=master --wait --verbose
Redémarrage à partir d'une étape spécifique (Avancé)
La CLI de Jenkins n'a pas de commande directe restart-stage. Le redémarrage d'un pipeline à partir d'une étape spécifique est principalement une fonctionnalité de l'interface utilisateur de Jenkins (souvent activée par le plugin "Pipeline Steps") ou nécessite une logique de pipeline spécifique.
Cependant, vous pouvez obtenir un effet similaire en concevant votre pipeline pour accepter des paramètres qui permettent de sauter les étapes initiales. Par exemple :
// Dans votre Jenkinsfile
parameters {
booleanParam(name: 'SKIP_SETUP_STAGE', defaultValue: false, description: 'Skip the initial setup stage')
}
pipeline {
agent any
stages {
stage('Setup') {
when {
expression { !params.SKIP_SETUP_STAGE }
}
steps {
echo 'Running setup...'
// ... setup steps ...
}
}
stage('Build') {
steps {
echo 'Building application...'
// ... build steps ...
}
}
// ... other stages ...
}
}
Ensuite, vous pouvez déclencher cette construction paramétrée via CLI pour sauter l'étape "Setup" :
jcli build MyPipelineJob -p SKIP_SETUP_STAGE=true
Cette approche nécessite une réflexion préalable dans la conception de votre Jenkinsfile, mais offre un contrôle puissant sur l'exécution du pipeline via la CLI.
Dépannage avancé avec Groovy (via CLI)
Les commandes groovy et groovy-script vous permettent d'exécuter du code Groovy arbitraire sur le contrôleur Jenkins. Cela fournit un accès inégalé à l'API interne de Jenkins pour une inspection et une manipulation approfondies.
Exemple : Obtention des détails de construction
jcli groovy =
'def job = Jenkins.instance.getItemByFullName("MyPipelineJob")
def build = job.getBuildByNumber(123)
if (build) {
println "Build #${build.number} for ${job.name}"
println "Status: ${build.result}"
println "Duration: ${build.durationString}"
println "Description: ${build.description ?: "N/A"}"
println "Causes:"
build.getCauses().each { cause ->
println " - ${cause.shortDescription}"
}
} else {
println "Build 123 not found for MyPipelineJob"
}'
Ce script récupère des informations complètes sur une construction spécifique, ce qui peut être inestimable pour comprendre pourquoi une construction a échoué, surtout si le journal de console est moins clair.
Exécution de scripts Groovy locaux
Pour des scripts Groovy plus complexes, écrivez-les dans un fichier .groovy et exécutez-le via groovy-script :
# my_troubleshooting_script.groovy
def jobName = System.getenv('JOB_NAME') ?: 'MyPipelineJob'
def buildNumber = System.getenv('BUILD_NUMBER') ? Integer.parseInt(System.getenv('BUILD_NUMBER')) : 123
def job = Jenkins.instance.getItemByFullName(jobName)
def build = job?.getBuildByNumber(buildNumber)
if (build) {
println "Build details for ${job.name} #${build.number}"
println "Status: ${build.result}"
build.getAction(hudson.model.ParametersAction.class)?.getParameters()?.each { p ->
println "Param: ${p.name} = ${p.value}"
}
} else {
println "Job ${jobName} or Build ${buildNumber} not found."
}
Ensuite, exécutez-le :
JOB_NAME=MyPipelineJob BUILD_NUMBER=123 jcli groovy-script my_troubleshooting_script.groovy
Cela permet le contrôle de version de vos outils de dépannage.
Conseils pour un dépannage efficace
- Soyez précis : Lorsque vous utilisez
grep, affinez vos modèles. Recherchez des codes d'erreur spécifiques, des messages uniques ou des horodatages. - Le contexte est essentiel : Considérez toujours les lignes de journal environnantes. Les erreurs ont souvent des précurseurs ou des messages de suivi qui fournissent plus de contexte.
- Structure du pipeline : Concevez vos Jenkinsfiles avec des noms d'étapes clairs et une journalisation détaillée dans les étapes critiques. Cela facilite l'identification des problèmes.
- Utiliser
tee: Lorsque vous exécutez des commandes CLI, vous pouvez acheminer la sortie versteepour à la fois l'afficher et l'enregistrer dans un fichier pour une analyse ultérieure.
bash jcli console MyPipelineJob 123 | tee build_123_log.txt | grep -i error - Journaux système Jenkins : N'oubliez pas que Jenkins lui-même a des journaux système (
JENKINS_HOME/logs). Parfois, un échec de construction est dû à un problème système Jenkins, et non au code du pipeline. Vous pouvez y accéder via l'interface utilisateur (Manage Jenkins -> System Log) ou directement sur le système de fichiers du serveur Jenkins.
Conclusion
La CLI de Jenkins est un outil indispensable pour les administrateurs comme pour les développeurs, offrant un moyen rapide et puissant d'interagir avec votre instance Jenkins. En maîtrisant les commandes permettant de récupérer les journaux, d'inspecter les variables d'environnement (via Groovy) et de déclencher efficacement les constructions, vous pouvez réduire considérablement le temps passé à diagnostiquer et à résoudre les échecs de construction. Intégrez ces techniques CLI dans votre flux de travail quotidien pour maintenir des pipelines CI/CD hautement performants et fiables.
Continuez à explorer la liste étendue des commandes de la CLI Jenkins (jcli help) et la puissance du scripting Groovy pour débloquer des capacités d'automatisation et de dépannage encore plus avancées.