TawaKnow LogoTawaKnow
AWSDevOpsFavorisContribuer

© 2026 TawaKnow. Tous droits réservés.

Mentions LégalesPolitique de confidentialitéContribuer
Pratiques DevOps
0/29 chapitres0%
1.

Introduction au DevOps

2.

Introduction à Linux

3.

Système de Fichiers Linux

4.

Interface en Ligne de Commande (CLI)

5.

Gestionnaire de Paquets Linux

6.

Vim — Éditeur de Texte CLI

7.

Utilisateurs & Groupes Linux

8.

Permissions & Propriété des Fichiers

9.

Shell Scripting Bash

10.

Variables d'Environnement Linux

11.

Réseau Linux

12.

SSH — Secure Shell

13.

Introduction à Git & Contrôle de Version

14.

Configurer un Dépôt Git

15.

Flux de Travail Git — add, commit, push, pull

16.

Branches Git & Merge Requests

17.

Git Avancé — Commandes, .gitignore & Bonnes Pratiques

18.

Outils de Build & Gestionnaires de Paquets

19.

Build Tools, Docker & CI/CD

20.

Introduction à Nexus — Gestionnaire de Dépôts d'Artifacts

21.

Installer et Configurer Nexus sur un Serveur

22.

Nexus — Repositories, Publication et API REST

23.

Introduction aux Containers & Docker

24.

Commandes Docker & Registries

25.

Dockerfile — Créer des Images Docker

26.

Docker Compose, Volumes & Bonnes Pratiques

27.

Introduction à Jenkins & CI/CD

28.

Installer et Configurer Jenkins

29.

Jenkins Pipeline & Jenkinsfile

...Jenkins Pipeline & Jenkinsfile
CoursPratiques DevOpsJenkins Pipeline & Jenkinsfile
Chapitre 29/29

Jenkins Pipeline & JenkinsfileJenkins Pipeline & Jenkinsfile

6 min de lecture
Total: ~6 min
Progression du cours0/29 chapitres

Jenkins Jobs & Pipelines — Jenkinsfile

Un Pipeline Jenkins automatise toutes les étapes du CI/CD dans un fichier de code versionné dans Git.


Types de Jobs Jenkins

TypeDescriptionCas d'usage
Freestyle ProjectConfiguration via UI uniquementScripts simples, tâches basiques
PipelineScript Jenkinsfile, multi-étapesCI/CD complet, recommandé
Multibranch PipelinePipeline par branche GitFeature branches, PR automatiques
Organization FolderScan auto des repos GitHub/GitLabGrandes organisations

Recommandation : utiliser Pipeline ou Multibranch Pipeline pour tout CI/CD sérieux.


Pipeline as Code

Pourquoi Pipeline as Code ?

Configuration UI (Freestyle)Pipeline as Code (Jenkinsfile)
Configuration dans l'interface JenkinsConfiguration dans un fichier texte
Non versionné dans GitCommité avec le code source
Difficile à auditerHistorique Git complet
Risque de perte de configReproductible et portable
Pas de code reviewReview possible comme le code

"Everything as Code" — best practice DevOps : versionner la configuration comme le code.

Principe

Code source
    +
Jenkinsfile     ──► git commit ──► Git repo
                                       │
                                       ▼ webhook trigger
                                   Jenkins lit le Jenkinsfile
                                   et exécute le pipeline

Jenkinsfile — Syntaxes

2 syntaxes disponibles

DeclarativeScripted
SyntaxeStructure prédéfinie, YAML-likeGroovy pur, libre
FacilitéPlus simple à lire/écrirePlus complexe
FlexibilitéMoins flexibleTrès flexible
Recommandé✅ Oui (débutants et équipes)Pour cas avancés

Jenkinsfile Declaratif — Structure de Base

pipeline {
    agent any                       // Où s'exécute le pipeline

    environment {                   // Variables d'environnement globales
        APP_NAME = "mon-app"
        REGISTRY = "docker.io/moncompte"
    }

    stages {
        stage('Build') {            // Étape 1 : Build
            steps {
                sh 'npm install'
                sh 'npm run build'
            }
        }

        stage('Test') {             // Étape 2 : Tests
            steps {
                sh 'npm test'
            }
        }

        stage('Docker Build') {     // Étape 3 : Image Docker
            steps {
                sh "docker build -t ${APP_NAME}:${BUILD_NUMBER} ."
            }
        }

        stage('Push') {             // Étape 4 : Push registry
            steps {
                withCredentials([usernamePassword(
                    credentialsId: 'docker-hub',
                    usernameVariable: 'USER',
                    passwordVariable: 'PASS'
                )]) {
                    sh "docker login -u $USER -p $PASS"
                    sh "docker push ${REGISTRY}/${APP_NAME}:${BUILD_NUMBER}"
                }
            }
        }

        stage('Deploy') {           // Étape 5 : Déploiement
            steps {
                sh "ssh user@server 'docker pull ${REGISTRY}/${APP_NAME}:${BUILD_NUMBER}'"
                sh "ssh user@server 'docker run -d -p 3000:3000 ${REGISTRY}/${APP_NAME}:${BUILD_NUMBER}'"
            }
        }
    }

    post {                          // Actions après le pipeline
        success {
            echo 'Pipeline réussi !'
        }
        failure {
            echo 'Pipeline échoué !'
            // slackSend channel: '#devops', message: "Build ${BUILD_NUMBER} failed"
        }
    }
}

Champs obligatoires

BlocRôleValeurs courantes
pipelineBloc racine obligatoire—
agentOù s'exécute le pipelineany, none, docker, label agent
stagesConteneur de toutes les étapes—
stage('Nom')Une étape nomméeNom libre
stepsCommandes à exécuter dans l'étapesh, echo, script, etc.

Directives Clés

agent — Exécuteur

agent any                           // N'importe quel agent disponible
agent none                          // Pas d'agent global (défini par stage)
agent { label 'linux' }             // Agent avec ce label
agent {                             // Docker comme agent d'exécution
    docker { image 'node:18-alpine' }
}

environment — Variables

environment {
    BUILD_NUMBER = "${env.BUILD_NUMBER}"    // Variables Jenkins intégrées
    BRANCH_NAME  = "${env.BRANCH_NAME}"
    DOCKER_TAG   = "1.0.${BUILD_NUMBER}"
}

Variables Jenkins intégrées utiles :

VariableValeur
BUILD_NUMBERNuméro du build (1, 2, 3...)
BRANCH_NAMENom de la branche Git
GIT_COMMITHash du commit
WORKSPACEChemin du workspace Jenkins
JOB_NAMENom du job Jenkins

when — Conditions

stage('Deploy Production') {
    when {
        branch 'main'               // Seulement sur la branche main
    }
    steps {
        sh './deploy.sh prod'
    }
}

stage('Deploy Staging') {
    when {
        branch 'develop'
    }
    steps {
        sh './deploy.sh staging'
    }
}

post — Actions post-build

post {
    always   { echo 'Toujours exécuté' }
    success  { echo 'Build réussi' }
    failure  { echo 'Build échoué' }
    unstable { echo 'Build instable (tests failed)' }
    changed  { echo 'Statut différent du build précédent' }
}

Triggers Automatiques

pipeline {
    triggers {
        pollSCM('H/5 * * * *')     // Vérifier Git toutes les 5 min
        cron('H 2 * * 1-5')        // Déclenchement planifié (lun-ven 2h)
    }
    // ...
}

Méthode recommandée : Webhooks Git

  • GitHub/GitLab envoie un événement à Jenkins à chaque push
  • Déclenche le build immédiatement (pas de polling)
  • Configurer dans les settings du repo Git : URL Jenkins + secret token

Multibranch Pipeline

Pour créer automatiquement un pipeline par branche Git :

Repo Git
├── main         →  Pipeline "main"      (build + deploy prod)
├── develop      →  Pipeline "develop"   (build + deploy staging)
├── feature/x   →  Pipeline "feature/x" (build + tests only)
└── feature/y   →  Pipeline "feature/y" (build + tests only)

Jenkins scanne le repository, détecte les branches contenant un Jenkinsfile, et crée un pipeline automatiquement pour chacune.

Configuration : New Item → Multibranch Pipeline → Branch Sources (GitHub/GitLab) + Credentials.


Exemple Complet — Application Java avec Maven

pipeline {
    agent any

    tools {
        maven 'Maven-3.9'           // Outil configuré dans Manage Jenkins → Tools
        jdk 'JDK-17'
    }

    stages {
        stage('Checkout') {
            steps {
                git branch: 'main',
                    credentialsId: 'git-credentials',
                    url: 'https://github.com/mon-org/mon-app.git'
            }
        }

        stage('Build & Test') {
            steps {
                sh 'mvn clean package'
            }
            post {
                always {
                    junit 'target/surefire-reports/**/*.xml'  // Rapport tests
                }
            }
        }

        stage('Build Docker Image') {
            steps {
                sh "docker build -t mon-app:${BUILD_NUMBER} ."
            }
        }

        stage('Push to Nexus') {
            steps {
                nexusArtifactUploader(
                    nexusVersion: 'nexus3',
                    protocol: 'http',
                    nexusUrl: 'nexus:8081',
                    groupId: 'com.example',
                    artifactId: 'mon-app',
                    version: "1.0.${BUILD_NUMBER}",
                    repository: 'maven-releases',
                    credentialsId: 'nexus-credentials',
                    artifacts: [[ artifactId: 'mon-app', file: 'target/mon-app.jar', type: 'jar' ]]
                )
            }
        }
    }
}

Jenkinsfile Scripté (référence)

// Syntaxe Scriptée — Groovy pur
node {
    stage('Build') {
        sh 'npm install'
        sh 'npm run build'
    }
    stage('Test') {
        sh 'npm test'
    }
    stage('Deploy') {
        if (env.BRANCH_NAME == 'main') {
            sh './deploy.sh'
        }
    }
}

Même logique que le Declaratif, mais sans la structure imposée — plus de liberté Groovy.


À retenir

  • Freestyle = config UI uniquement → éviter pour le CI/CD
  • Pipeline = Jenkinsfile dans Git → recommandé
  • Multibranch = un pipeline par branche Git → idéal pour feature branches
  • Jenkinsfile Declaratif : pipeline → agent → stages → stage → steps
  • environment = variables, when = conditions, post = actions après le build
  • Variables Jenkins : BUILD_NUMBER, BRANCH_NAME, GIT_COMMIT
  • Triggers : webhooks Git (push) → plus réactif que pollSCM
  • withCredentials = utiliser les secrets stockés dans Jenkins sans les exposer
Précédent
Installer et Configurer Jenkins
Retour au cours
Sur cette page
PrécédentTerminer