Découvrez Jenkins, le serveur CI/CD open source le plus populaire. Installation, configuration, création de jobs, pipelines Jenkinsfile, plugins essentiels et automatisation complète de vos workflows DevOps.
Qu'est-ce que Jenkins ?
Jenkins est un serveur d'automatisation open-source écrit en Java. C'est l'outil de référence pour l'intégration continue (CI) et le déploiement continu (CD), utilisé par des millions de développeurs dans le monde.
Jenkins permet d'automatiser toutes les étapes du cycle de vie d'une application : build, tests, déploiement, monitoring, et bien plus encore grâce à son écosystème riche de plus de 1800 plugins.
Installation de Jenkins
Installation sur Linux (Ubuntu/Debian)
# Ajouter la clé GPG Jenkins
curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key | sudo tee \
/usr/share/keyrings/jenkins-keyring.asc > /dev/null
# Ajouter le dépôt Jenkins
echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \
https://pkg.jenkins.io/debian-stable binary/ | sudo tee \
/etc/apt/sources.list.d/jenkins.list > /dev/null
# Installer Java (prérequis)
sudo apt-get update
sudo apt-get install fontconfig openjdk-17-jre
# Installer Jenkins
sudo apt-get install jenkins
# Démarrer Jenkins
sudo systemctl start jenkins
sudo systemctl enable jenkins
# Vérifier le statut
sudo systemctl status jenkins
Installation via Docker
# Créer un volume pour persister les données
docker volume create jenkins-data
# Lancer Jenkins dans un conteneur
docker run -d \
--name jenkins \
-p 8080:8080 \
-p 50000:50000 \
-v jenkins-data:/var/jenkins_home \
jenkins/jenkins:lts
# Récupérer le mot de passe initial
docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword
Premier démarrage
Accédez à http://localhost:8080 et suivez l'assistant de configuration :
- Entrez le mot de passe initial (affiché dans les logs ou dans
/var/jenkins_home/secrets/initialAdminPassword) - Installez les plugins suggérés
- Créez votre compte administrateur
- Configurez l'URL de Jenkins
/etc/default/jenkins sur Linux ou utilisez -p 9090:8080 avec Docker.
Créer votre premier job
Freestyle Project
Le type de job le plus simple pour démarrer :
- Cliquez sur "Nouveau Item"
- Entrez un nom :
mon-premier-job - Sélectionnez "Freestyle project"
- Dans "Build", ajoutez "Exécuter un script shell"
- Entrez le script :
#!/bin/bash
echo "Hello from Jenkins!"
date
whoami
pwd
- Cliquez sur "Sauvegarder"
- Cliquez sur "Lancer un build"
- Consultez les logs dans "Console Output"
Job avec Git
Configuration pour récupérer le code depuis Git :
- Dans "Source Code Management", sélectionnez "Git"
- Entrez l'URL du dépôt :
https://github.com/user/mon-projet.git - Ajoutez des credentials si le dépôt est privé
- Spécifiez la branche :
*/main - Dans "Build Triggers", cochez "Poll SCM"
- Schedule :
H/5 * * * *(vérifie toutes les 5 minutes) - Script de build :
#!/bin/bash
npm install
npm test
npm run build
Pipelines Jenkins
Les Pipelines permettent de définir l'intégralité du processus CI/CD sous forme de code. C'est la méthode recommandée pour les projets modernes.
Créer un Pipeline
- Nouveau Item → "Pipeline"
- Dans "Pipeline", sélectionnez "Pipeline script"
- Entrez le code Groovy :
pipeline {
agent any
stages {
stage('Checkout') {
steps {
git branch: 'main', url: 'https://github.com/user/mon-projet.git'
}
}
stage('Build') {
steps {
sh 'npm install'
sh 'npm run build'
}
}
stage('Test') {
steps {
sh 'npm test'
}
}
stage('Deploy') {
steps {
echo 'Déploiement en production...'
sh './deploy.sh'
}
}
}
post {
success {
echo 'Pipeline exécuté avec succès!'
}
failure {
echo 'Pipeline échoué!'
}
}
}
Syntaxe déclarative vs scripte
Jenkins supporte deux syntaxes de pipeline :
- Déclarative (recommandée) : Plus simple, structurée, avec validation
- Scripte : Plus flexible, basée sur Groovy pur
Jenkinsfile et Pipeline as Code
Au lieu de définir le pipeline dans l'interface Jenkins, créez un fichier Jenkinsfile dans votre dépôt Git.
Avantages
- Pipeline versionné avec le code source
- Code review du pipeline via Pull Requests
- Réutilisable et partageable entre projets
- Historique complet des modifications
Exemple de Jenkinsfile complet
// Jenkinsfile
pipeline {
agent {
docker {
image 'node:18-alpine'
}
}
environment {
NODE_ENV = 'production'
API_URL = credentials('api-url')
}
options {
timeout(time: 30, unit: 'MINUTES')
timestamps()
buildDiscarder(logRotator(numToKeepStr: '10'))
}
stages {
stage('Checkout') {
steps {
checkout scm
}
}
stage('Install Dependencies') {
steps {
sh 'npm ci'
}
}
stage('Lint') {
steps {
sh 'npm run lint'
}
}
stage('Test') {
parallel {
stage('Unit Tests') {
steps {
sh 'npm run test:unit'
}
}
stage('Integration Tests') {
steps {
sh 'npm run test:integration'
}
}
}
}
stage('Build') {
steps {
sh 'npm run build'
}
}
stage('Docker Build') {
steps {
script {
docker.build("mon-app:${env.BUILD_NUMBER}")
}
}
}
stage('Deploy to Staging') {
when {
branch 'develop'
}
steps {
sh 'kubectl apply -f k8s/staging/'
}
}
stage('Deploy to Production') {
when {
branch 'main'
}
steps {
input message: 'Déployer en production?', ok: 'Déployer'
sh 'kubectl apply -f k8s/production/'
}
}
}
post {
always {
junit 'test-results/**/*.xml'
archiveArtifacts artifacts: 'dist/**/*', fingerprint: true
}
success {
slackSend color: 'good', message: "Build réussi: ${env.JOB_NAME} #${env.BUILD_NUMBER}"
}
failure {
slackSend color: 'danger', message: "Build échoué: ${env.JOB_NAME} #${env.BUILD_NUMBER}"
}
}
}
Configuration du job pour utiliser le Jenkinsfile
- Nouveau Item → "Pipeline"
- Dans "Pipeline", sélectionnez "Pipeline script from SCM"
- SCM : "Git"
- Repository URL : votre dépôt Git
- Script Path :
Jenkinsfile(par défaut)
credentials('id') dans le Jenkinsfile pour accéder aux secrets stockés dans Jenkins.
Plugins essentiels
Jenkins dispose de plus de 1800 plugins. Voici les incontournables :
Source Control
- Git Plugin : Intégration Git (inclus par défaut)
- GitHub Plugin : Intégration GitHub avec webhooks
- GitLab Plugin : Intégration GitLab
- Bitbucket Plugin : Intégration Bitbucket
Build & Test
- NodeJS Plugin : Gestion des versions Node.js
- Maven Integration Plugin : Support Maven pour Java
- Gradle Plugin : Support Gradle
- Docker Pipeline Plugin : Utiliser Docker dans les pipelines
- JUnit Plugin : Afficher les résultats de tests
Déploiement
- SSH Agent Plugin : Connexion SSH pour déploiement
- Publish Over SSH : Transfert de fichiers via SSH
- Kubernetes CLI Plugin : Déploiement Kubernetes
- AWS Steps Plugin : Intégration AWS
Notifications
- Slack Notification Plugin : Alertes Slack
- Email Extension Plugin : Emails personnalisés
- Discord Notifier : Notifications Discord
Qualité & Sécurité
- SonarQube Scanner : Analyse de code
- Warnings Next Generation : Analyse des warnings
- OWASP Dependency-Check : Scan de vulnérabilités
Installation de plugins
# Via l'interface : Manage Jenkins → Manage Plugins → Available
# Ou via CLI :
java -jar jenkins-cli.jar -s http://localhost:8080/ install-plugin docker-workflow
Intégration Git et webhooks
Configuration GitHub Webhook
- Dans votre dépôt GitHub : Settings → Webhooks → Add webhook
- Payload URL :
http://votre-jenkins-url/github-webhook/ - Content type :
application/json - Événements : "Just the push event" ou personnalisez
- Active : ✅
Configuration Jenkins
Dans votre job Jenkins :
- Build Triggers → Cochez "GitHub hook trigger for GITScm polling"
- Installez le plugin GitHub Plugin si ce n'est pas fait
Multibranch Pipeline
Le Multibranch Pipeline crée automatiquement un pipeline pour chaque branche du dépôt.
- Nouveau Item → "Multibranch Pipeline"
- Branch Sources → "Git" ou "GitHub"
- Repository URL : votre dépôt
- Behaviors : Discover branches, Discover pull requests
- Build Configuration → "by Jenkinsfile"
Jenkins détectera automatiquement toutes les branches contenant un Jenkinsfile et créera un pipeline pour chacune.
Bonnes pratiques
- Pipeline as Code : Toujours utiliser Jenkinsfile dans le dépôt Git
- Agents dédiés : Utilisez des agents Docker ou Kubernetes pour l'isolation
- Shared Libraries : Centralisez le code réutilisable entre pipelines
- Credentials sécurisés : Stockez les secrets dans Jenkins Credentials
- Build rapides : Optimisez les builds avec cache et parallélisation
- Nettoyage régulier : Configurez
buildDiscarderpour limiter l'historique - Monitoring : Activez les métriques Prometheus
- Backup : Sauvegardez régulièrement
$JENKINS_HOME - Version Jenkins : Utilisez la version LTS pour la stabilité
- Sécurité : Activez CSRF protection et Matrix-based security
Exemple de Shared Library
// vars/buildNodeApp.groovy
def call(Map config) {
pipeline {
agent any
stages {
stage('Build') {
steps {
sh "npm install"
sh "npm run build"
}
}
stage('Test') {
steps {
sh "npm test"
}
}
}
}
}
// Jenkinsfile
@Library('my-shared-library') _
buildNodeApp(
nodeVersion: '18'
)
Conclusion
Jenkins reste l'outil CI/CD le plus populaire et le plus flexible grâce à son écosystème de plugins. Sa courbe d'apprentissage est compensée par sa puissance et sa capacité à s'adapter à n'importe quel workflow.
Explorez les pipelines CI/CD pour approfondir les concepts d'automatisation et de déploiement continu.