Tutoriel : Déploiement de Jenkins via Docker Compose avec pipeline .NET Core
Ce tutoriel présente la mise en place d'une instance Jenkins dans un conteneur Docker, construite via Docker Compose, et la configuration d'un pipeline Jenkins qui exécute des builds .NET Core dans des conteneurs Docker éphémères. La bonne pratique utilisée ici consiste à organiser les Dockerfiles dans des sous-répertoires pour une meilleure isolation des contextes de build.
1. Prérequis
- Docker Engine installé sur l'hôte (docs Docker).
- Docker Compose installé (docs Docker Compose).
- Accès Internet pour télécharger les images et installer les packages.
- Plugin Jenkins requis : Docker Pipeline (à installer via Manage Jenkins → Manage Plugins).
2. Organisation du projet
Nous recommandons la structure suivante pour gérer plusieurs Dockerfiles et outils :
project-root/
├── jenkins/
│ └── Dockerfile # Dockerfile pour l'image Jenkins personnalisée
├── Jenkinsfile # Pipeline Jenkins pour l'application .NET Core
└── docker-compose.yml # Fichier Docker Compose pour builder et déployer Jenkins
3. Création de l'image Jenkins personnalisée
Dans le répertoire jenkins/, créez le fichier Dockerfile suivant :
# jenkins/Dockerfile
# Utilisation de l'image officielle Jenkins LTS
FROM jenkins/jenkins:lts
# Passage en mode root pour installer des packages
USER root
# Installation des paquets nécessaires et configuration du dépôt Docker
RUN apt-get update && \
apt-get install -y ca-certificates curl gnupg2 lsb-release apt-transport-https software-properties-common && \
install -m 0755 -d /etc/apt/keyrings && \
curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc && \
chmod a+r /etc/apt/keyrings/docker.asc && \
. /etc/os-release && \
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian $VERSION_CODENAME stable" \
| tee /etc/apt/sources.list.d/docker.list > /dev/null && \
apt-get update && \
apt-get install -y docker-ce-cli && \
rm -rf /var/lib/apt/lists/*
# Ajout du groupe Docker et ajout de l'utilisateur Jenkins à ce groupe.
# Remplacez 999 par le GID obtenu via : stat -c '%g' /var/run/docker.sock sur votre hôte.
ARG DOCKER_GID=999
RUN groupadd -for -g ${DOCKER_GID} docker && usermod -aG docker jenkins
# Retour à l'utilisateur Jenkins
USER jenkins
Explications techniques :
- Ce Dockerfile installe d'abord les paquets nécessaires et ajoute le dépôt Docker officiel en utilisant la procédure recommandée.
- Il installe ensuite le paquet
docker-ce-clipour permettre à Jenkins de lancer des commandes Docker.- La partie ajoutant le groupe Docker est réalisée via un argument de build (
DOCKER_GID). Vous devez remplacer999par le GID obtenu sur votre système via :L'utilisateur Jenkins est ajouté à ce groupe afin d'avoir les droits nécessaires pour accéder au socket Docker.stat -c '%g' /var/run/docker.sock
4. Déploiement via Docker Compose
Créez à la racine du projet un fichier docker-compose.yml avec la configuration suivante :
version: '3.8'
services:
jenkins:
build:
context: ./jenkins
dockerfile: Dockerfile
args:
DOCKER_GID: 999 # Remplacez 999 par le GID obtenu sur votre système
container_name: jenkins-master
ports:
- "8080:8080"
- "50000:50000"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- jenkins_home:/var/jenkins_home
volumes:
jenkins_home:
Note :
Aucune directivegroup_addn'est nécessaire dans le fichier Compose, puisque la configuration se fait dans l'image via le Dockerfile.
Lancez Jenkins avec la commande suivante :
docker-compose up -d
Explications techniques :
- La section
buildindique à Docker Compose de builder l'image depuis le répertoirejenkins/et de passer l'argumentDOCKER_GIDpour configurer le groupe Docker. - Le montage du socket Docker (
/var/run/docker.sock) permet à Jenkins de lancer des agents Docker. - Le volume
jenkins_homepermet de persister les données de Jenkins.
5. Configuration du plugin Docker Pipeline dans Jenkins
- Accédez à l'interface Jenkins via http://localhost:8080.
- Récupérez le mot de passe initial dans le conteneur (dans le fichier
/var/jenkins_home/secrets/initialAdminPasswordou via les logs). - Installez le plugin Docker Pipeline via Manage Jenkins → Manage Plugins.
6. Création d’un pipeline Jenkins pour une application .NET Core
Créez à la racine du projet un fichier Jenkinsfile avec le contenu suivant :
pipeline {
agent none
stages {
stage('Restore') {
agent {
docker {
image 'mcr.microsoft.com/dotnet/sdk:6.0'
// Chaque étape démarre dans un conteneur neuf pour garantir un environnement propre
reuseNode false
}
}
steps {
// Restauration des packages NuGet
sh 'dotnet restore'
}
}
stage('Build') {
agent {
docker {
image 'mcr.microsoft.com/dotnet/sdk:6.0'
reuseNode false
}
}
steps {
// Compilation en configuration Release
sh 'dotnet build --configuration Release'
}
}
stage('Test') {
agent {
docker {
image 'mcr.microsoft.com/dotnet/sdk:6.0'
reuseNode false
}
}
steps {
// Exécution des tests unitaires sans recompilation
sh 'dotnet test --no-build --verbosity normal'
}
}
}
}
Détails techniques :
- agent none : Le pipeline global n'est lié à aucun agent ; chaque stage définit ainsi son propre environnement.
- agent docker : Chaque stage s'exécute dans un conteneur Docker isolé basé sur l'image du SDK .NET Core.
- reuseNode false : Pour chaque stage, un nouveau conteneur est créé, garantissant un environnement de build propre.
Important : Jenkins monte automatiquement le workspace sur ces conteneurs, assurant la persistance des fichiers générés nécessaires entre les étapes.
7. Déploiement et validation du pipeline
-
Création du job Pipeline :
- Dans Jenkins, créez un nouveau job de type Pipeline.
- Configurez-le pour pointer vers votre dépôt Git contenant le
Jenkinsfileou copiez directement le script dans l'éditeur du pipeline.
-
Exécution et vérification :
- Lancez le pipeline.
- Vérifiez dans la console du job que chaque étape (restore, build, test) s'exécute dans un conteneur Docker distinct et que les commandes .NET s'exécutent correctement.
8. Références techniques
- Documentation Docker : https://docs.docker.com/engine/
- Documentation Docker Compose : https://docs.docker.com/compose/
- Documentation Jenkins Pipeline : https://www.jenkins.io/doc/book/pipeline/
- Plugin Docker Pipeline : https://plugins.jenkins.io/docker-workflow/
- Documentation .NET SDK : https://docs.microsoft.com/dotnet/core/tools/