|
@@ -133,8 +133,8 @@ pipeline {
|
|
|
// }
|
|
// }
|
|
|
|
|
|
|
|
// 6. Lancement des backups après déploiement
|
|
// 6. Lancement des backups après déploiement
|
|
|
- stage('Backup') {
|
|
|
|
|
- steps {
|
|
|
|
|
|
|
+ stage('Backup') {
|
|
|
|
|
+ steps {
|
|
|
script {
|
|
script {
|
|
|
echo "🚀 Lancement du backup sur le container ${env.BACKUP_CONTAINER}"
|
|
echo "🚀 Lancement du backup sur le container ${env.BACKUP_CONTAINER}"
|
|
|
|
|
|
|
@@ -159,20 +159,35 @@ pipeline {
|
|
|
echo "✅ Container ${env.BACKUP_CONTAINER} est actif"
|
|
echo "✅ Container ${env.BACKUP_CONTAINER} est actif"
|
|
|
sleep(10)
|
|
sleep(10)
|
|
|
|
|
|
|
|
|
|
+ // Vérifier les logs du container pour s'assurer qu'il fonctionne bien
|
|
|
|
|
+ echo "📋 Vérification des logs récents du container backup..."
|
|
|
|
|
+ sh "docker logs --tail 10 ${env.BACKUP_CONTAINER} 2>&1 || true"
|
|
|
|
|
+
|
|
|
|
|
+ // Déclencher un backup manuel en utilisant mongodump avec les bonnes variables
|
|
|
echo "💾 Déclenchement du backup manuel..."
|
|
echo "💾 Déclenchement du backup manuel..."
|
|
|
def backupExitCode = sh(
|
|
def backupExitCode = sh(
|
|
|
script: """
|
|
script: """
|
|
|
- docker exec ${env.BACKUP_CONTAINER} sh -c '
|
|
|
|
|
- BACKUP_DIR="/backup/\$(date +%Y-%m-%d_%H-%M-%S)" &&
|
|
|
|
|
|
|
+ docker exec ${env.BACKUP_CONTAINER} bash -c '
|
|
|
|
|
+ echo "=== Démarrage du backup manuel ===" &&
|
|
|
|
|
+ BACKUP_DIR="/backup/manual-\$(date +%Y-%m-%d_%H-%M-%S)" &&
|
|
|
mkdir -p "\$BACKUP_DIR" &&
|
|
mkdir -p "\$BACKUP_DIR" &&
|
|
|
- mongodump --host=\${MONGO_HOST} --port=\${MONGO_PORT} \\
|
|
|
|
|
- --archive="\$BACKUP_DIR/dump.archive.gz" --gzip
|
|
|
|
|
|
|
+ mongodump --host=\$MONGODB_HOST --port=\$MONGODB_PORT \\
|
|
|
|
|
+ --username=\$MONGODB_USER --password=\$MONGODB_PASS \\
|
|
|
|
|
+ --authenticationDatabase=\$MONGODB_AUTHENTICATION_DATABASE \\
|
|
|
|
|
+ --archive="\$BACKUP_DIR/dump.archive.gz" --gzip &&
|
|
|
|
|
+ echo "Backup terminé dans \$BACKUP_DIR"
|
|
|
'
|
|
'
|
|
|
""",
|
|
""",
|
|
|
returnStatus: true
|
|
returnStatus: true
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
if (backupExitCode == 0) {
|
|
if (backupExitCode == 0) {
|
|
|
|
|
+ echo "✅ Commande de backup lancée avec succès"
|
|
|
|
|
+
|
|
|
|
|
+ // Attendre un peu pour que le backup se termine
|
|
|
|
|
+ sleep(30)
|
|
|
|
|
+
|
|
|
|
|
+ // Vérifier les fichiers de backup créés
|
|
|
def backupFiles = sh(
|
|
def backupFiles = sh(
|
|
|
script: "docker exec ${env.BACKUP_CONTAINER} find /backup -name '*.gz' -type f -mtime -1 | head -5",
|
|
script: "docker exec ${env.BACKUP_CONTAINER} find /backup -name '*.gz' -type f -mtime -1 | head -5",
|
|
|
returnStdout: true
|
|
returnStdout: true
|
|
@@ -180,24 +195,36 @@ pipeline {
|
|
|
|
|
|
|
|
if (backupFiles) {
|
|
if (backupFiles) {
|
|
|
echo "✅ Backup ${env.ENV.toUpperCase()} réussi !"
|
|
echo "✅ Backup ${env.ENV.toUpperCase()} réussi !"
|
|
|
- echo "📁 Fichiers :"
|
|
|
|
|
|
|
+ echo "📁 Fichiers créés :"
|
|
|
backupFiles.split('\n').each { file ->
|
|
backupFiles.split('\n').each { file ->
|
|
|
if (file.trim()) {
|
|
if (file.trim()) {
|
|
|
- echo sh(
|
|
|
|
|
|
|
+ def fileInfo = sh(
|
|
|
script: "docker exec ${env.BACKUP_CONTAINER} ls -lh '${file.trim()}'",
|
|
script: "docker exec ${env.BACKUP_CONTAINER} ls -lh '${file.trim()}'",
|
|
|
returnStdout: true
|
|
returnStdout: true
|
|
|
).trim()
|
|
).trim()
|
|
|
|
|
+ echo fileInfo
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
} else {
|
|
} else {
|
|
|
- echo "⚠️ Aucun fichier de backup récent trouvé"
|
|
|
|
|
|
|
+ echo "⚠️ Aucun fichier de backup récent trouvé, vérification des logs..."
|
|
|
|
|
+ sh "docker logs --tail 20 ${env.BACKUP_CONTAINER} 2>&1 || true"
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ // Afficher le statut final
|
|
|
|
|
+ echo "📊 Statut final du backup :"
|
|
|
|
|
+ sh """
|
|
|
|
|
+ docker exec ${env.BACKUP_CONTAINER} bash -c '
|
|
|
|
|
+ echo "=== Espace disque utilisé ===" &&
|
|
|
|
|
+ df -h /backup &&
|
|
|
|
|
+ echo "=== Derniers backups ===" &&
|
|
|
|
|
+ ls -la /backup/ | tail -10
|
|
|
|
|
+ ' || true
|
|
|
|
|
+ """
|
|
|
|
|
+
|
|
|
} else {
|
|
} else {
|
|
|
echo "❌ Backup échoué avec code ${backupExitCode}"
|
|
echo "❌ Backup échoué avec code ${backupExitCode}"
|
|
|
- echo sh(
|
|
|
|
|
- script: "docker logs --tail 20 ${env.BACKUP_CONTAINER} 2>&1 || true",
|
|
|
|
|
- returnStdout: true
|
|
|
|
|
- )
|
|
|
|
|
|
|
+ echo "📋 Logs détaillés :"
|
|
|
|
|
+ sh "docker logs --tail 30 ${env.BACKUP_CONTAINER} 2>&1 || true"
|
|
|
currentBuild.result = 'UNSTABLE'
|
|
currentBuild.result = 'UNSTABLE'
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -205,15 +232,31 @@ pipeline {
|
|
|
echo "❌ Container ${env.BACKUP_CONTAINER} inactif — tentative de redémarrage"
|
|
echo "❌ Container ${env.BACKUP_CONTAINER} inactif — tentative de redémarrage"
|
|
|
sh "docker-compose -f ${env.COMPOSE_FILE} restart mongodb-backup-${env.ENV} || true"
|
|
sh "docker-compose -f ${env.COMPOSE_FILE} restart mongodb-backup-${env.ENV} || true"
|
|
|
sleep(30)
|
|
sleep(30)
|
|
|
|
|
+
|
|
|
|
|
+ // Vérifier le statut après redémarrage
|
|
|
|
|
+ def newStatus = sh(
|
|
|
|
|
+ script: "docker ps --filter name=${env.BACKUP_CONTAINER} --format '{{.Status}}'",
|
|
|
|
|
+ returnStdout: true
|
|
|
|
|
+ ).trim()
|
|
|
|
|
+
|
|
|
|
|
+ if (newStatus.contains('Up')) {
|
|
|
|
|
+ echo "✅ Container redémarré avec succès"
|
|
|
|
|
+ } else {
|
|
|
|
|
+ echo "❌ Échec du redémarrage, vérification des logs..."
|
|
|
|
|
+ sh "docker logs --tail 20 ${env.BACKUP_CONTAINER} 2>&1 || true"
|
|
|
|
|
+ currentBuild.result = 'UNSTABLE'
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
|
echo "❌ Erreur lors du backup: ${e.getMessage()}"
|
|
echo "❌ Erreur lors du backup: ${e.getMessage()}"
|
|
|
|
|
+ echo "📋 Logs d'urgence :"
|
|
|
|
|
+ sh "docker logs --tail 20 ${env.BACKUP_CONTAINER} 2>&1 || true"
|
|
|
currentBuild.result = 'UNSTABLE'
|
|
currentBuild.result = 'UNSTABLE'
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
- }
|
|
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
// 7. Push optionnel de l'image dans le registre Nexus
|
|
// 7. Push optionnel de l'image dans le registre Nexus
|
|
|
// stage('Push to Private Registry') {
|
|
// stage('Push to Private Registry') {
|