← Retour
#!/bin/bash
# ═══════════════════════════════════════════════════════════════════════════
# ROLLBACK.SH - Script de rollback manuel
# Permet de revenir à une version précédente d'un service
#
# Usage: rollback.sh <config_file> [steps]
# Exemple: rollback.sh conf.prod.gouroubleu.yml 1
# ═══════════════════════════════════════════════════════════════════════════
set -euo pipefail
# ───────────────────────────────────────────────────────────────────────────
# PATHS
# ───────────────────────────────────────────────────────────────────────────
if [[ -d "/stock_8to/33800-stack" ]]; then
STOCK_BASE="/stock_8to/33800-stack"
elif [[ -d "/mnt/stock_8to/33800-stack" ]]; then
STOCK_BASE="/mnt/stock_8to/33800-stack"
else
echo "ERROR: Cannot find 33800-stack directory"
exit 1
fi
SCRIPTS_DIR="${STOCK_BASE}/scripts/deploy"
# ───────────────────────────────────────────────────────────────────────────
# LOAD LIBS
# ───────────────────────────────────────────────────────────────────────────
source "${SCRIPTS_DIR}/lib/common.sh"
source "${SCRIPTS_DIR}/lib/parse-yaml.sh"
source "${SCRIPTS_DIR}/lib/targets.sh"
[[ -f "${SCRIPTS_DIR}/lib/notifications.sh" ]] && source "${SCRIPTS_DIR}/lib/notifications.sh"
[[ -f "${SCRIPTS_DIR}/lib/registry.sh" ]] && source "${SCRIPTS_DIR}/lib/registry.sh"
# ───────────────────────────────────────────────────────────────────────────
# ARGUMENTS
# ───────────────────────────────────────────────────────────────────────────
if [[ $# -lt 1 ]]; then
echo "Usage: rollback.sh <config_file> [steps]"
echo " config_file: Fichier conf.gouroubleu.yml"
echo " steps: Nombre de versions à remonter (défaut: 1)"
exit 1
fi
CONFIG_FILE="$1"
STEPS="${2:-1}"
if [[ ! -f "$CONFIG_FILE" ]]; then
log_error "Fichier de config non trouvé: $CONFIG_FILE"
exit 1
fi
# ───────────────────────────────────────────────────────────────────────────
# PARSE CONFIG
# ───────────────────────────────────────────────────────────────────────────
parse_yaml "$CONFIG_FILE" "CFG_"
parse_yaml_section "$CONFIG_FILE" "deploy" "CFG_"
require_var CFG_name
require_var CFG_target
echo "═══════════════════════════════════════════════════════════════════════════"
echo " ROLLBACK - ${CFG_name}"
echo "═══════════════════════════════════════════════════════════════════════════"
echo " Target: ${CFG_target}"
echo " Steps: ${STEPS}"
echo "═══════════════════════════════════════════════════════════════════════════"
echo ""
# ───────────────────────────────────────────────────────────────────────────
# RESOLVE TARGET
# ───────────────────────────────────────────────────────────────────────────
resolve_target "${CFG_target}"
# ───────────────────────────────────────────────────────────────────────────
# EXECUTE ROLLBACK
# ───────────────────────────────────────────────────────────────────────────
STRATEGY_FILE="${SCRIPTS_DIR}/strategies/${TARGET_TYPE}.sh"
if [[ ! -f "$STRATEGY_FILE" ]]; then
log_error "Stratégie non trouvée: $STRATEGY_FILE"
exit 1
fi
source "$STRATEGY_FILE"
# Appeler la fonction de rollback appropriée
case "$TARGET_TYPE" in
files)
rollback_files "$STEPS"
;;
remote)
rollback_remote
;;
docker)
log_error "Rollback Docker non supporté (utiliser docker rollback ou redéployer)"
exit 1
;;
*)
log_error "Rollback non supporté pour: $TARGET_TYPE"
exit 1
;;
esac
# ───────────────────────────────────────────────────────────────────────────
# NOTIFY
# ───────────────────────────────────────────────────────────────────────────
if type notify_rollback &>/dev/null; then
notify_rollback "${CFG_name}" "${CFG_target}" "current" "previous-${STEPS}"
fi
if type registry_update_service &>/dev/null; then
registry_update_service "${CFG_name}" "${CFG_target}" "${TARGET_TYPE}" "rollback" "rolled_back"
fi
echo ""
echo "═══════════════════════════════════════════════════════════════════════════"
log_success "Rollback terminé: ${CFG_name}"
echo "═══════════════════════════════════════════════════════════════════════════"