Contactez-nous

Débogage basique d'un Pipeline

Apprenez les techniques de débogage de base pour vos pipelines Jenkins. Utilisez echo pour le traçage, comprenez les logs et relancez des étapes spécifiques pour résoudre les problèmes CI/CD.

Quand le pipeline déraille : les premiers pas du débogage

Même avec la meilleure planification, il arrive que les pipelines Jenkins ne se comportent pas comme prévu. Des erreurs de syntaxe dans le Jenkinsfile, des conditions inattendues, des variables mal définies ou des commandes externes qui échouent peuvent entraîner des comportements erratiques ou des échecs de build. Savoir comment aborder le débogage d'un pipeline est une compétence essentielle pour tout utilisateur de Jenkins souhaitant maintenir des flux CI/CD robustes et fiables.

Contrairement au débogage d'applications traditionnelles avec des points d'arrêt interactifs, le débogage d'un Jenkinsfile est souvent plus proche du débogage de scripts : il repose beaucoup sur l'analyse des logs, l'ajout d'instructions de traçage, et la compréhension du flux d'exécution. Cette section se concentre sur des techniques de débogage basiques mais efficaces, applicables par tous.

L'objectif est de vous fournir des outils simples pour comprendre ce qui se passe à l'intérieur de votre pipeline, identifier où les choses tournent mal, et comment isoler les problèmes pour une résolution plus rapide.

L'instruction `echo` : votre meilleur ami pour le traçage

L'une des techniques de débogage les plus simples et les plus universelles dans les scripts, y compris les Jenkinsfiles, est l'utilisation d'instructions pour afficher des informations à des points clés de l'exécution. Dans un pipeline Jenkins, la commande `echo` remplit ce rôle à merveille. Elle vous permet d'imprimer des messages personnalisés, des valeurs de variables, ou l'état d'une condition directement dans la sortie console du build.

Vous pouvez utiliser `echo` à l'intérieur d'un bloc `steps` pour vérifier la valeur d'une variable d'environnement, d'un paramètre de build, ou d'une variable que vous avez définie dans votre script Groovy :

pipeline {
    agent any
    parameters {
        string(name: 'BRANCH_NAME', defaultValue: 'main', description: 'Branche à builder')
    }
    stages {
        stage('Setup') {
            steps {
                script {
                    echo "Début du build sur la branche: ${params.BRANCH_NAME}"
                    def myVar = "Valeur de test"
                    echo "La variable myVar contient: ${myVar}"
                    echo "Variable d'environnement BUILD_NUMBER: ${env.BUILD_NUMBER}"
                }
            }
        }
        stage('Exécution') {
            steps {
                script {
                    if (params.BRANCH_NAME == 'develop') {
                        echo "Traitement spécifique pour la branche develop"
                        // ... autres actions
                    } else {
                        echo "Traitement standard pour la branche ${params.BRANCH_NAME}"
                    }
                }
            }
        }
    }
}

En examinant la sortie console, vous pourrez voir les messages affichés par `echo` et ainsi suivre le flux d'exécution, vérifier que les variables contiennent les valeurs attendues, et comprendre quelles branches conditionnelles sont prises. C'est un moyen efficace de valider vos hypothèses sur le comportement du pipeline sans avoir à deviner.

N'oubliez pas de retirer ou de commenter ces instructions `echo` de débogage une fois le problème résolu, afin de ne pas polluer inutilement la sortie console des builds réussis.

Analyser la sortie console et les logs de Jenkins

La sortie console d'un build est une mine d'informations pour le débogage. Au-delà de vos propres messages `echo`, elle contient les logs de Jenkins lui-même indiquant les étapes exécutées ([Pipeline] stage, [Pipeline] sh, etc.), les commandes lancées, et leurs résultats. En cas d'erreur, c'est là que vous trouverez les messages les plus explicites et les traces d'appels (stack traces).

Lorsque vous déboguez, portez une attention particulière à :

  • Les erreurs explicites : Messages commençant par ERROR, FAILURE, ou des codes de sortie non nuls de commandes shell.
  • Les stack traces Groovy : Si votre script de pipeline contient une erreur de syntaxe Groovy ou une exception lors de l'exécution d'une méthode, une stack trace Groovy sera affichée. Elle indique la ligne du Jenkinsfile où l'erreur s'est produite.
  • Les avertissements (Warnings) : Ils peuvent indiquer des problèmes potentiels ou des configurations dépréciées.
  • L'ordre d'exécution : Vérifiez que les étapes s'exécutent dans l'ordre attendu.

Parfois, l'erreur réelle peut se produire bien avant le point où le pipeline échoue visiblement. Remontez dans les logs pour voir si des avertissements ou des comportements anormaux ont été signalés plus tôt.

En plus de la console du build, les logs généraux de Jenkins (accessibles via Administrer Jenkins > System Log) peuvent parfois contenir des informations utiles, notamment pour des problèmes liés à la configuration de Jenkins lui-même, des plugins, ou des agents.

Relancer des étapes spécifiques (si possible et pertinent)

Dans certains cas, notamment pour des pipelines longs ou complexes, il peut être frustrant de devoir relancer l'intégralité du pipeline pour tester une correction sur une étape tardive. Jenkins offre, dans certaines conditions, la possibilité de relancer un build échoué à partir d'une étape spécifique. Cette fonctionnalité est particulièrement utile avec les pipelines déclaratifs et l'interface Blue Ocean.

Si un stage échoue, l'interface Blue Ocean peut proposer une option pour "Rerun" le stage. Jenkins tentera alors de reprendre l'exécution à partir du début du stage échoué, en utilisant les mêmes paramètres et le même état (workspace) que lors de la tentative précédente (attention, le workspace peut avoir été modifié par les étapes antérieures).

Pour les pipelines classiques ou via l'interface Jenkins standard, la relance d'une étape spécifique est moins directe. Cependant, vous pouvez manuellement déclencher un nouveau build avec les mêmes paramètres. Si votre pipeline est bien conçu et que les étapes sont idempotentes (c'est-à-dire qu'elles peuvent être exécutées plusieurs fois avec le même résultat sans effets de bord indésirables), cela peut simuler une reprise.

Il est important de noter que la relance d'étapes n'est pas toujours pertinente. Si l'échec est dû à un problème dans une étape très en amont qui a corrompu l'état pour les étapes suivantes, relancer une étape tardive ne résoudra rien. De même, si l'échec est dû à un problème externe (par exemple, un service réseau temporairement indisponible), la relance peut réussir sans modification du pipeline.

Lors du développement d'un pipeline, il peut être judicieux de commenter temporairement les étapes que vous ne souhaitez pas exécuter à chaque fois pour vous concentrer sur la partie que vous déboguez. Par exemple, si vous travaillez sur une étape de déploiement, vous pouvez commenter les étapes de build et de test pour accélérer les itérations :

pipeline {
    agent any
    stages {
        /* Temporairement commenté pour débogage
        stage('Build') {
            steps {
                echo 'Building...'
                // sh './build.sh'
            }
        }
        stage('Test') {
            steps {
                echo 'Testing...'
                // sh './test.sh'
            }
        }
        */
        stage('Deploy') {
            steps {
                echo 'Deploying...'
                // sh './deploy.sh'
                echo "Déploiement de la branche ${env.BRANCH_NAME}"
            }
        }
    }
}

Cette approche, combinée à `echo` et à l'analyse des logs, constitue une base solide pour le débogage de vos pipelines Jenkins.