Comment sauvegarder et restaurer votre instance Jenkins
Jenkins sert de plaque tournante centrale d'automatisation pour l'intégration continue et la livraison continue (CI/CD). Les données de configuration — y compris les définitions de tâches, les informations d'identification des utilisateurs, les paramètres des plugins et l'historique des constructions — représentent un investissement organisationnel important. La perte de ces données due à une défaillance matérielle, une erreur de configuration ou une migration peut stopper complètement les pipelines de développement.
Ce guide complet détaille les composants essentiels d'une stratégie de sauvegarde Jenkins robuste, en se concentrant sur la méthode très fiable de l'instantané du système de fichiers. Nous fournirons des instructions étape par étape pour sauvegarder votre instance en toute sécurité et la procédure correspondante pour la restaurer sans heurts, garantissant ainsi la continuité des activités et la tranquillité d'esprit.
Comprendre le cœur : le répertoire $JENKINS_HOME
Chaque instance Jenkins repose sur un répertoire racine unique, désigné sous le nom de $JENKINS_HOME. Ce répertoire contient tous les fichiers de configuration, les plugins, les journaux et les données des tâches. Sauvegarder Jenkins signifie fondamentalement sauvegarder le contenu de ce répertoire.
Selon votre méthode d'installation (par exemple, paquet Linux, conteneur Docker), l'emplacement de $JENKINS_HOME varie généralement :
- Linux (Installation par paquet) :
/var/lib/jenkins - Docker : Souvent monté sur un volume, par exemple
/var/jenkins_home - JAR autonome : Le répertoire d'où le processus Jenkins a été démarré, sauf indication contraire via les variables d'environnement.
Identification des composants de données critiques
Bien que la sauvegarde de l'intégralité du répertoire $JENKINS_HOME soit l'approche la plus simple, elle peut conduire à des archives extrêmement volumineuses si l'historique des constructions et les données de l'espace de travail sont inclus. Pour une sauvegarde de reprise après sinistre rapide et efficace, vous devez vous assurer que les répertoires et fichiers suivants sont capturés :
| Composant | Chemin dans $JENKINS_HOME |
Objectif |
|---|---|---|
| Configuration globale | config.xml |
Fichier de configuration principal pour l'instance racine de Jenkins. |
| Définitions de tâches | jobs/ |
Contient des sous-répertoires pour chaque tâche configurée, chacun avec son propre config.xml. |
| Utilisateurs et identifiants | users/ et credentials.xml |
Comptes utilisateurs, paramètres du domaine de sécurité et secrets stockés. |
| Clés de sécurité | secrets/ |
Clés de chiffrement essentielles pour déchiffrer les données sensibles comme les identifiants stockés. |
| Liste des plugins | plugins/ |
Contient les fichiers .hpi pour tous les plugins installés. |
| Définitions de nœuds | nodes/ |
Configurations pour tous les agents de construction connectés (s'ils sont définis). |
Méthode 1 : La sauvegarde du système de fichiers (Recommandée)
La méthode la plus fiable pour sauvegarder Jenkins consiste à créer une archive compressée et cohérente des fichiers nécessaires pendant que le service est brièvement arrêté.
Étape 1 : Arrêter le service Jenkins
Pour garantir la cohérence des données et éviter les écritures partielles de fichiers pendant le processus de sauvegarde, le processus Jenkins doit être interrompu. Ne pas arrêter le service risque de produire une sauvegarde incomplète ou corrompue.
# Pour les systèmes utilisant systemd (la plupart des distributions Linux modernes)
sudo systemctl stop jenkins
# Ou, pour les systèmes utilisant la commande service
sudo service jenkins stop
Étape 2 : Créer l'archive de sauvegarde
Accédez au répertoire parent de $JENKINS_HOME et utilisez tar pour créer une archive compressée. Il est fortement recommandé d'exclure les artefacts de construction volumineux pour économiser de l'espace et du temps.
En supposant que $JENKINS_HOME est /var/lib/jenkins :
JENKINS_HOME="/var/lib/jenkins"
BACKUP_TARGET="/mnt/backups/jenkins"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
ARCHIVE_NAME="jenkins_backup_${TIMESTAMP}.tar.gz"
# Créer le répertoire cible s'il n'existe pas
mkdir -p $BACKUP_TARGET
# Créer l'archive, en excluant l'historique des constructions et les espaces de travail
sudo tar -czvf $BACKUP_TARGET/$ARCHIVE_NAME \n --exclude="${JENKINS_HOME}/workspace" \n --exclude="${JENKINS_HOME}/caches" \n --exclude="${JENKINS_HOME}/jobs/*/builds" \n $JENKINS_HOME
Conseil : Inclure l'historique des constructions
Si la conservation de l'historique des constructions (
jobs/*/builds) est critique, vous pouvez supprimer le drapeau--excludecorrespondant. Cependant, préparez-vous à ce que les tailles d'archives atteignent potentiellement des centaines de gigaoctets.
Étape 3 : Vérifier et stocker hors site
Une fois l'archive créée, testez son intégrité et transférez-la immédiatement vers un emplacement de stockage externe et géographiquement séparé (par exemple, un compartiment S3, un lecteur réseau) pour vous protéger contre une panne à l'échelle du site.
Étape 4 : Redémarrer Jenkins
sudo systemctl start jenkins
Méthode 2 : Utilisation du plugin de sauvegarde Jenkins (Solution partielle)
Bien que des plugins comme ThinBackup ou Backup Plugin existent, ils ne capturent souvent que les fichiers de configuration (config.xml) et peuvent ne pas gérer robustement les fichiers volumineux ou tous les éléments de sécurité nécessaires. Ils sont généralement adaptés à la sauvegarde des configurations de tâches uniquement et ne doivent pas être utilisés pour une stratégie complète et sécurisée de reprise après sinistre.
Restauration de votre instance Jenkins
La restauration implique de copier les données sauvegardées dans le répertoire $JENKINS_HOME de la machine cible et de s'assurer que les autorisations des fichiers sont correctes avant de démarrer le service.
Étape 1 : Préparer l'environnement cible
Assurez-vous que le système cible (ou le système réparé) a Jenkins installé, mais maintenez le service arrêté.
sudo systemctl stop jenkins
Étape 2 : Vider les données Jenkins existantes (Facultatif mais recommandé)
Si vous restaurez sur une machine qui hébergeait précédemment Jenkins, videz le contenu existant de $JENKINS_HOME pour garantir un environnement propre.
# Faites attention à la commande 'rm -rf' !
sudo rm -rf /var/lib/jenkins/*
Étape 3 : Extraire l'archive de sauvegarde
Copiez l'archive compressée (jenkins_backup_latest.tar.gz) sur la machine cible et extrayez-la dans le répertoire $JENKINS_HOME. L'indicateur -C spécifie le répertoire cible pour l'extraction.
# En supposant que l'archive est dans /tmp et que JENKINS_HOME est /var/lib/jenkins
sudo tar -xzvf /tmp/jenkins_backup_latest.tar.gz -C /var/lib/
# Remarque : Si la commande tar a inclus le répertoire parent dans l'archive, ajustez le chemin.
# Le résultat doit être le contenu de l'archive remplaçant le contenu de /var/lib/jenkins
Étape 4 : Vérifier et corriger les permissions
C'est l'étape la plus critique après la restauration. Si la propriété des fichiers est incorrecte, Jenkins ne démarrera pas ou ne fonctionnera pas de manière sécurisée. Vous devez définir la propriété de manière récursive sur l'utilisateur et le groupe sous lesquels le service Jenkins s'exécute (souvent jenkins:jenkins).
JENKINS_HOME="/var/lib/jenkins"
JENKINS_USER="jenkins"
JENKINS_GROUP="jenkins"
sudo chown -R $JENKINS_USER:$JENKINS_GROUP $JENKINS_HOME
sudo chmod -R 755 $JENKINS_HOME
Étape 5 : Démarrer Jenkins et vérifier
Démarrez le service et surveillez les journaux pour assurer un démarrage réussi.
sudo systemctl start jenkins
# Surveiller les journaux de démarrage
sudo tail -f /var/log/jenkins/jenkins.log
Après un démarrage réussi, vérifiez que toutes les tâches, les utilisateurs et les plugins installés sont présents et fonctionnent correctement.
Bonnes pratiques pour les sauvegardes automatisées
Pour aller au-delà des sauvegardes manuelles, mettez en place l'automatisation à l'aide d'outils système et de gestion de configuration externe.
1. Tirer parti des tâches Cron
Planifiez l'exécution du script de sauvegarde (Étapes 1 et 2 de la méthode 1) quotidiennement ou nocturnement à l'aide de cron ou d'un planificateur similaire. Assurez-vous que la tâche cron s'exécute en tant qu'utilisateur disposant des autorisations appropriées pour arrêter et démarrer le service Jenkins et pour lire/écrire dans le répertoire $JENKINS_HOME.
2. Configuration as Code (CasC)
Envisagez d'adopter Jenkins Configuration as Code (CasC). CasC définit les paramètres, les tâches et les plugins de Jenkins à l'aide de fichiers YAML déclaratifs. En stockant ces fichiers YAML dans un référentiel de contrôle de source séparé (comme Git), votre configuration devient portable et versionnée, simplifiant considérablement l'exigence de sauvegarde principale.
Avertissement : Sécurisation des identifiants
Lors de la restauration d'une instance, assurez-vous que le répertoire
secrets/est présent et correct. Si Jenkins ne trouve pas les clés utilisées pour chiffrer les identifiants (tels que les clés API ou les mots de passe), ces identifiants deviendront inutilisables et devront être ressaisis manuellement.