Créez votre premier pipeline déclaratif Jenkins pour l'intégration et le déploiement continus (CI/CD)

Libérez la puissance de la livraison de logiciels automatisée en créant votre premier Pipeline Déclaratif Jenkins. Ce guide complet fournit un tutoriel étape par étape couvrant l'intégralité du flux de travail CI/CD, de l'intégration de la gestion du code source à la définition d'étapes de construction, de test et de déploiement conditionnel sécurisées. Apprenez la structure fondamentale du `Jenkinsfile` et mettez en œuvre les meilleures pratiques pour gérer les agents et les identifiants, garantissant une automatisation robuste et maintenable pour vos projets.

38 vues

Créez Votre Premier Pipeline Déclaratif Jenkins pour le CI/CD

Jenkins est le standard de facto pour les serveurs d'automatisation open-source, servant de pilier aux pipelines d'intégration continue et de livraison continue (CI/CD) au sein de milliers d'organisations. Bien que Jenkins propose deux types de syntaxe de pipeline — Scripté et Déclaratif —, la syntaxe de Pipeline Déclaratif est l'approche recommandée pour la plupart des utilisateurs en raison de sa DSL Groovy plus simple, structurée et plus lisible.

Ce guide fournit un tutoriel complet et étape par étape sur la création de votre tout premier Pipeline Déclaratif Jenkins fonctionnel. Nous aborderons l'intégration de la gestion du code source (SCM), la définition de l'environnement de build, l'exécution des tests et l'implémentation d'une étape de déploiement d'exemple, vous offrant ainsi une base solide pour automatiser votre cycle de vie de livraison logicielle.

Comprendre la Structure du Pipeline Déclaratif

Le Pipeline Déclaratif définit l'ensemble du flux de travail dans un fichier nommé Jenkinsfile, qui est stocké aux côtés de votre code d'application dans votre dépôt SCM (par exemple, Git). Cette pratique est connue sous le nom de Pipeline en tant que Code.

Éléments Clés d'un Pipeline Déclaratif

Un Pipeline Déclaratif doit contenir les blocs de niveau supérieur suivants :

  1. pipeline : Le bloc extérieur obligatoire définissant le contenu du pipeline.
  2. agent : Spécifie où le pipeline ou une étape spécifique sera exécuté (par exemple, any, none, ou des labels spécifiques).
  3. stages : Contient un ou plusieurs blocs stage séquentiels.
  4. stage : Définit un bloc de travail conceptuel (par exemple, Build, Test, Déploiement).
  5. steps : Contient une ou plusieurs commandes ou fonctions exécutées au sein d'une stage.
pipeline {
    agent any 
    environment { // Facultatif : Définit les variables d'environnement
        APP_VERSION = '1.0.0'
    }
    stages {
        stage('Build') {
            steps {
                // Les commandes vont ici
            }
        }
    }
    post { // Facultatif : Actions exécutées après la fin du pipeline
        always { 
            echo 'Pipeline finished.' 
        }
    }
}

Étape 1 : Configuration du Job Jenkins

Pour exécuter un Pipeline à partir du code, vous devez configurer un job Jenkins pour lire le Jenkinsfile depuis votre dépôt.

  1. Naviguez vers votre tableau de bord Jenkins et sélectionnez Nouvel Élément.
  2. Entrez un nom pour votre pipeline (par exemple, my-first-ci-pipeline).
  3. Sélectionnez le type d'élément Pipeline et cliquez sur OK.
  4. Sur la page de configuration, faites défiler jusqu'à la section Pipeline.
  5. Changez la définition de Script de pipeline à Script de pipeline depuis SCM.
  6. Sélectionnez votre SCM (par exemple, Git).
  7. Entrez l'URL du Dépôt et configurez vos identifiants si nécessaire.
  8. Assurez-vous que le Chemin du Script est défini sur Jenkinsfile (la valeur par défaut).

Étape 2 : Définition du Jenkinsfile pour le CI/CD

Nous allons créer un Jenkinsfile complet qui simule un flux de travail CI/CD simple, intégrant des étapes standard pour un déploiement réussi.

Supposons que vous ayez une structure de dépôt contenant le code source de votre application (par exemple, un simple projet Python ou Java) et le Jenkinsfile à la racine.

L'Exemple Complet du Pipeline Déclaratif

Ce pipeline utilise l'agent node (s'il est configuré) et des étapes shell basiques (sh) pour simuler un travail réel. L'étape de déploiement est conditionnelle, s'exécutant uniquement après la réussite des étapes précédentes.

// Jenkinsfile
pipeline {
    // 1. Définition de l'Agent : Spécifie où l'ensemble du pipeline s'exécute
    agent { 
        label 'my-build-agent' // Utilisez un label spécifique si disponible, ou 'any'
    }

    // 2. Variables d'Environnement : Définissez des variables utilisables tout au long du pipeline
    environment {
        CONTAINER_REGISTRY = 'registry.example.com'
        IMAGE_NAME = 'myapp'
    }

    stages {

        // Étape 1 : Extraction du Code Source (Source Code Management)
        stage('Checkout Source') {
            steps {
                // L'étape 'checkout scm' extrait automatiquement le code 
                // en fonction de la configuration définie dans les paramètres du job Jenkins.
                checkout scm
                sh 'echo "Source code successfully checked out."
            }
        }

        // Étape 2 : Construction des Artéfacts
        stage('Build Artifact') {
            steps {
                sh 'echo "Starting build for $IMAGE_NAME:$BUILD_ID"'
                // Simulation : Construire une image Docker ou compiler un fichier jar/war
                sh "docker build -t ${IMAGE_NAME}:${BUILD_ID} ."
            }
        }

        // Étape 3 : Tests et Portes de Qualité
        stage('Run Tests') {
            steps {
                sh './run_unit_tests.sh'
                sh 'echo "Running integration tests..."'
                // Exemple de collecte des résultats de test (nécessite les plugins appropriés)
                // junit '**/target/surefire-reports/*.xml'
            }
        }

        // Étape 4 : Déploiement (Conditionnel)
        stage('Deploy to Staging') {
            // La directive 'when' garantit que l'étape ne s'exécute que sous des conditions spécifiques
            when {
                branch 'main'
            }
            steps {
                sh "docker push ${CONTAINER_REGISTRY}/${IMAGE_NAME}:${BUILD_ID}"
                sh 'kubectl apply -f k8s/deployment-staging.yaml'
                script {
                    // Les blocs script permettent une logique Groovy traditionnelle au sein des étapes Déclaratives
                    echo "Deployment successful to Staging environment."
                }
            }
        }
    }

    // 3. Post-Actions : Définir des actions basées sur le statut final du pipeline
    post {
        success {
            echo 'Pipeline completed successfully. Notifying team via Slack...'
            // slackSend channel: '#devops-alerts', message: 'CI/CD Success!'
        }
        failure {
            echo 'Pipeline failed. Review logs for errors.'
        }
        cleanup {
            sh 'docker rmi -f $(docker images -aq --filter label=build_id=$BUILD_ID)'
        }
    }
}

Étape 3 : Exécution et Surveillance du Pipeline

Une fois le Jenkinsfile commité et poussé vers la branche configurée dans votre job Jenkins :

  1. Sur la page du job Jenkins, cliquez sur Construire Maintenant (ou attendez le sondage SCM/le déclencheur webhook).
  2. Surveillez le build dans le panneau Historique des Builds.
  3. Cliquez sur le numéro de build en cours d'exécution et sélectionnez Sortie Console pour voir les détails d'exécution étape par étape.
  4. Vous pouvez également utiliser la visualisation Vue des Étapes (si le plugin est installé) pour voir la progression des étapes Checkout, Build, Test et Deploy graphiquement.

Bonnes Pratiques et Fonctionnalités Avancées

Utilisation des Bibliothèques et du Code Partagé

Pour les étapes complexes ou très répétitives, évitez d'écrire du Groovy verbeux directement dans le Jenkinsfile. Utilisez plutôt les Bibliothèques Partagées. Ces bibliothèques externes vous permettent de définir des fonctions communes (comme des routines de déploiement standard ou des fonctions de notification) qui peuvent être appelées depuis plusieurs pipelines, rendant votre Jenkinsfile plus propre.

// Appel d'une étape de bibliothèque partagée
stage('Custom Setup') {
    steps {
        customLibrary.initializeEnvironment(env: 'prod')
    }
}

Travailler avec les Identifiants

Ne jamais coder en dur des informations sensibles (mots de passe, jetons, clés API) directement dans le Jenkinsfile. Utilisez le système de gestion des identifiants intégré de Jenkins.

L'étape withCredentials vous permet d'accéder en toute sécurité aux secrets stockés :

stage('Authenticate Registry') {
    steps {
        withCredentials([usernamePassword(credentialsId: 'docker-registry-creds', 
                                          passwordVariable: 'PASS', 
                                          usernameVariable: 'USER')]) {
            sh "docker login -u ${USER} -p ${PASS} ${CONTAINER_REGISTRY}"
        }
    }
}

Avertissement : Sélection de l'Agent

Conseil : Définissez toujours votre agent spécifiquement en utilisant un label plutôt que agent any. L'utilisation de agent any signifie que le pipeline pourrait s'exécuter sur le nœud contrôleur de Jenkins, ce qui constitue un risque de sécurité et peut impacter les performances du contrôleur. Assurez-vous d'avoir correctement configuré les agents (nœuds) Jenkins avec les outils nécessaires (Docker, Maven, Node.js) installés.

Conclusion

Le Pipeline Déclaratif Jenkins offre un cadre puissant, lisible et maintenable pour l'implémentation de l'Intégration Continue et de la Livraison Continue. En définissant la structure du flux de travail — incluant les agents, les variables d'environnement, les étapes séquentielles et les actions post-build —, vous obtenez une visibilité et un contrôle complets sur votre processus d'automatisation logicielle. Avec ce Jenkinsfile fondamental établi, vous êtes maintenant prêt à intégrer des étapes plus complexes, telles que l'analyse de sécurité automatisée, la publication d'artéfacts et les promotions multi-environnements.