From 7cbb57f8c98b56b295ce0304e2b26afa9f0a2393 Mon Sep 17 00:00:00 2001 From: Nicolas Cantu Date: Tue, 6 Jan 2026 14:31:04 +0100 Subject: [PATCH] Reduce SSH connection attempts and improve socket cleanup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **Motivations:** - Too many SSH connection attempts were being made during deployment - ControlMaster socket cleanup was not aggressive enough - Multiple SSH calls at step 5 created excessive connection attempts **Root causes:** - ControlMaster socket could remain but be invalid, causing SSH to disable multiplexing - Each ssh_exec had up to 3 retries, and step 5 made 4-5 ssh_exec calls - Socket cleanup was not forceful enough to remove invalid sockets - Complex retry logic at step 5 created unnecessary SSH calls **Correctifs:** - Improved cleanup_dead_ssh() to forcefully remove socket and wait for proper closure - Reduced max retries in ssh_exec from 3 to 2 - Simplified step 5 logic to reduce SSH calls from 4-5 to 2 (one check, one init if needed) - Combined Git initialization commands into single SSH call to reduce connections - Added sleep after socket cleanup to ensure proper closure **Evolutions:** - More efficient SSH connection management - Reduced deployment time by minimizing connection attempts **Pages affectées:** - deploy.sh: Improved cleanup_dead_ssh(), reduced retries, simplified step 5 logic --- deploy.sh | 39 ++++++++++++++++----------------------- 1 file changed, 16 insertions(+), 23 deletions(-) diff --git a/deploy.sh b/deploy.sh index c05dbf9..ff5d152 100644 --- a/deploy.sh +++ b/deploy.sh @@ -16,8 +16,16 @@ SSH_CONTROL_PATH="${SSH_CONTROL_DIR}/debian_92.243.27.35_22" # Fonction pour nettoyer une connexion SSH morte cleanup_dead_ssh() { - ssh -O exit -o ControlPath="${SSH_CONTROL_PATH}" ${SERVER} 2>/dev/null || true + # Essayer de fermer proprement la connexion si elle existe + if [ -S "${SSH_CONTROL_PATH}" ]; then + ssh -O exit -o ControlPath="${SSH_CONTROL_PATH}" ${SERVER} 2>/dev/null || true + # Attendre un peu pour que la fermeture se termine + sleep 0.5 + fi + # Forcer la suppression du socket même s'il existe encore rm -f "${SSH_CONTROL_PATH}" 2>/dev/null || true + # Nettoyer aussi le répertoire parent s'il est vide + rmdir "${SSH_CONTROL_DIR}" 2>/dev/null || true } # Fonction pour vérifier si la connexion SSH maître est valide @@ -27,11 +35,11 @@ check_ssh_connection() { # Fonction pour exécuter une commande SSH avec connexion persistante et gestion d'erreurs robuste ssh_exec() { - local max_retries=3 + local max_retries=2 local retry_count=0 while [ $retry_count -lt $max_retries ]; do - # Vérifier si la connexion maître existe et est valide + # Nettoyer le socket s'il existe mais est invalide if [ -S "${SSH_CONTROL_PATH}" ]; then if ! check_ssh_connection; then # Connexion morte, nettoyer avant de réessayer @@ -40,6 +48,7 @@ ssh_exec() { fi # Exécuter la commande SSH + # Si le socket existe mais est invalide, SSH avec ControlMaster=auto le détectera et créera une nouvelle connexion if ssh -o ControlMaster=auto \ -o ControlPath="${SSH_CONTROL_PATH}" \ -o ControlPersist=300 \ @@ -147,26 +156,10 @@ echo "5. Vérification du dépôt Git sur le serveur..." if ssh_exec "cd ${APP_DIR} && git status >/dev/null 2>&1" >/dev/null 2>&1; then echo " ✓ Dépôt Git détecté" else - SSH_EXIT_CODE=$? - # Vérifier si c'est une erreur de connexion SSH ou si Git n'est pas initialisé - if [ $SSH_EXIT_CODE -ne 0 ]; then - echo " ⚠ Erreur de connexion SSH ou dépôt Git non initialisé" - echo " Tentative de nettoyage et nouvelle connexion..." - cleanup_dead_ssh - sleep 2 - # Réessayer une fois après nettoyage - if ssh_exec "cd ${APP_DIR} && git status >/dev/null 2>&1" >/dev/null 2>&1; then - echo " ✓ Dépôt Git détecté après réessai" - else - echo " ⚠ Dépôt Git non initialisé, initialisation..." - ssh_exec "cd ${APP_DIR} && git init && git remote add origin ${GIT_REPO} 2>/dev/null || git remote set-url origin ${GIT_REPO}" - ssh_exec "cd ${APP_DIR} && git checkout -b ${BRANCH} 2>/dev/null || true" - fi - else - echo " ⚠ Dépôt Git non initialisé, initialisation..." - ssh_exec "cd ${APP_DIR} && git init && git remote add origin ${GIT_REPO} 2>/dev/null || git remote set-url origin ${GIT_REPO}" - ssh_exec "cd ${APP_DIR} && git checkout -b ${BRANCH} 2>/dev/null || true" - fi + echo " ⚠ Dépôt Git non initialisé, initialisation..." + # Initialiser le dépôt Git en une seule commande pour réduire les appels SSH + ssh_exec "cd ${APP_DIR} && (git init 2>/dev/null || true) && (git remote add origin ${GIT_REPO} 2>/dev/null || git remote set-url origin ${GIT_REPO}) && (git checkout -b ${BRANCH} 2>/dev/null || true)" + echo " ✓ Dépôt Git initialisé" fi # Récupérer les dernières modifications