codigo0/scripts/deploy/post-receive

125 lines
4.3 KiB
Plaintext
Raw Normal View History

#!/bin/bash
# Hook post-receive para despliegue automático
# Ubicación: /var/repos/emerges-tes.git/hooks/post-receive
set -e # Salir si hay error
# Configuración
APP_DIR="/var/www/emerges-tes"
GIT_DIR="/var/repos/emerges-tes.git"
BRANCH="main"
LOG_FILE="/var/log/emerges-tes-deploy.log"
# Función de logging
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
log "=========================================="
log "🚀 Iniciando despliegue automático"
log "=========================================="
# Leer la rama que se está actualizando
while read oldrev newrev refname; do
# Usar GIT_DIR para obtener el nombre de la rama desde el repositorio bare
branch=$(git --git-dir="$GIT_DIR" rev-parse --symbolic --abbrev-ref $refname 2>/dev/null || echo "$refname" | sed 's|refs/heads/||')
if [ "$branch" = "$BRANCH" ]; then
log "📦 Actualizando rama: $branch"
log " Commit anterior: $oldrev"
log " Commit nuevo: $newrev"
# Verificar que el directorio de trabajo existe
if [ ! -d "$APP_DIR" ]; then
log "❌ ERROR: Directorio $APP_DIR no existe"
exit 1
fi
# Ir al directorio de trabajo
cd "$APP_DIR" || {
log "❌ ERROR: No se puede acceder a $APP_DIR"
exit 1
}
# Usar git directamente con --work-tree y --git-dir para evitar problemas de work tree
# Esto funciona tanto si APP_DIR es un repositorio git como si no lo es
# Si no existe .git, inicializar o clonar
if [ ! -d "$APP_DIR/.git" ]; then
log "⚠️ $APP_DIR no es un repositorio git, clonando..."
# Si el directorio tiene contenido, hacer backup o limpiar
if [ "$(ls -A $APP_DIR 2>/dev/null)" ]; then
log "⚠️ Directorio no vacío, haciendo backup..."
mv "$APP_DIR" "${APP_DIR}.backup.$(date +%s)" 2>/dev/null || true
fi
# Clonar desde el repositorio bare
git clone "$GIT_DIR" "$APP_DIR" || {
log "❌ ERROR: No se pudo clonar repositorio"
exit 1
}
cd "$APP_DIR" || exit 1
git checkout "$BRANCH" || {
log "❌ ERROR: No se pudo hacer checkout de $BRANCH"
exit 1
}
else
# Si ya es un repositorio, usar git normal
cd "$APP_DIR" || exit 1
# Obtener los últimos cambios
log "📥 Obteniendo cambios del repositorio..."
git fetch "$GIT_DIR" "$BRANCH" || {
log "❌ ERROR: Fallo al hacer fetch"
exit 1
}
# Resetear a la versión más reciente (checkout limpio)
log "🔄 Haciendo checkout limpio..."
git reset --hard "FETCH_HEAD" || {
log "❌ ERROR: Fallo al hacer reset"
exit 1
}
fi
# Limpiar archivos no rastreados (opcional, pero recomendado)
log "🧹 Limpiando archivos no rastreados..."
git clean -fd || {
log "⚠️ ADVERTENCIA: Fallo al limpiar archivos"
}
# Instalar dependencias
log "📦 Instalando dependencias (npm install)..."
if ! npm install --production=false 2>&1 | tee -a "$LOG_FILE"; then
log "❌ ERROR: Fallo al instalar dependencias"
exit 1
fi
log "✅ Dependencias instaladas correctamente"
# Build de producción
log "🔨 Construyendo aplicación (npm run build)..."
if ! npm run build 2>&1 | tee -a "$LOG_FILE"; then
log "❌ ERROR: Fallo al construir la aplicación"
exit 1
fi
log "✅ Build completado correctamente"
# Verificar que el build se creó
if [ ! -d "$APP_DIR/dist" ]; then
log "❌ ERROR: El directorio dist/ no existe después del build"
exit 1
fi
log "✅ Despliegue completado exitosamente"
log " Aplicación disponible en: $APP_DIR/dist"
log "=========================================="
exit 0
else
log "⏭️ Ignorando push en rama: $branch (solo se despliega $BRANCH)"
fi
done
log "⚠️ No se procesó ningún cambio"
exit 0