125 lines
4.3 KiB
Plaintext
125 lines
4.3 KiB
Plaintext
|
|
#!/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
|
||
|
|
|