107 lines
3.1 KiB
Bash
Executable File
107 lines
3.1 KiB
Bash
Executable File
#!/bin/bash
|
|
# --- Para que siempre se ejecute en el mismo path
|
|
cd "$(dirname "$0")"
|
|
|
|
# --- Configuración por defecto ---
|
|
MIGRATIONS_DIR="./migrations"
|
|
OUTPUT_FILE_PREFIX="esquema_final"
|
|
DB_NAME="temp_schema_build_$(date +%s)"
|
|
|
|
# --- Función de Ayuda ---
|
|
usage() {
|
|
echo "Uso: $0 -v <version> [-e <ruta_env>]"
|
|
echo " -v Versión semántica objetivo (ej: 1.2.0)"
|
|
echo " -e (Opcional) Ruta al archivo .env para cargar variables"
|
|
echo " Los archivos de verions tienen que tener el formato x.x.x_descripcion.sql (Es importante la _ para serpar las partes) "
|
|
exit 1
|
|
}
|
|
|
|
# --- Procesar Argumentos (Flags) ---
|
|
# v: obligatorio
|
|
# e: opcionar
|
|
while getopts "v:e:" opt; do
|
|
case $opt in
|
|
v) TARGET_VERSION="$OPTARG" ;;
|
|
e) ENV_PATH="$OPTARG" ;;
|
|
*) usage ;;
|
|
esac
|
|
done
|
|
|
|
# Validar que la versión esté presente
|
|
if [ -z "$TARGET_VERSION" ]; then
|
|
echo "Error: La versión es obligatoria."
|
|
usage
|
|
fi
|
|
|
|
# --- Cargar variables de entorno ---
|
|
if [ ! -z "$ENV_PATH" ]; then
|
|
if [ -f "$ENV_PATH" ]; then
|
|
echo "~> Cargando configuración desde: $ENV_PATH"
|
|
# Exporta automáticamente las variables definidas en el archivo
|
|
set -o allexport
|
|
source "$ENV_PATH"
|
|
set +o allexport
|
|
else
|
|
echo "Error: No se encontró el archivo .env en: $ENV_PATH"
|
|
exit 1
|
|
fi
|
|
else
|
|
echo "!> No se especificó archivo .env, usando variables del sistema actual"
|
|
fi
|
|
|
|
# echo "Debug: Usuario es '$PGUSER'"
|
|
# echo "Debug: Host es '$PGHOST'"
|
|
# echo "Debug: Password es '$PGPASSWORD'" # Cuidado con mostrar esto
|
|
|
|
# --- Función de limpieza (Safety Net) ---
|
|
cleanup() {
|
|
echo "~> Limpiando: Eliminando base de datos temporal '$DB_NAME'"
|
|
# Usamos las variables de conexión cargadas (si las hay)
|
|
dropdb $DB_NAME --if-exists 2>/dev/null
|
|
}
|
|
trap cleanup EXIT
|
|
|
|
# --- Inicio del Proceso ---
|
|
echo "~> Iniciando build para versión: $TARGET_VERSION"
|
|
|
|
# 1. Crear BD temporal
|
|
# Nota: Si tu .env tiene PGHOST, la BD se creará allí. Si no, en localhost.
|
|
createdb $DB_NAME
|
|
|
|
# 2. Ejecutar script base (si existe)
|
|
rm -rf init.sql
|
|
cat base/*.sql >init.sql
|
|
if [ -f "init.sql" ]; then
|
|
echo "~> Ejecutando init.sql..."
|
|
psql -d $DB_NAME -f init.sql >/dev/null
|
|
fi
|
|
|
|
# 3. Iterar y filtrar migraciones
|
|
echo "~> Aplicando migraciones hasta la versión $TARGET_VERSION..."
|
|
|
|
for f in $(ls $MIGRATIONS_DIR/*.sql | sort -V); do
|
|
FILENAME=$(basename "$f")
|
|
# Extraer versión (Asume formato V1.0.0_desc.sql o 1.0.0_desc.sql)
|
|
FILE_VER=$(echo "$FILENAME" | sed -E 's/^V//' | awk -F_ '{print $1}')
|
|
|
|
# Comparación semántica
|
|
echo "comparando $TARGET_VERSION con $FILE_VER"
|
|
LOWEST=$(echo -e "$TARGET_VERSION\n$FILE_VER" | sort -V | head -n1)
|
|
|
|
if [ "$LOWEST" == "$FILE_VER" ] || [ "$FILE_VER" == "$TARGET_VERSION" ]; then
|
|
echo "~> Aplicando: $FILENAME ($FILE_VER)"
|
|
psql -d $DB_NAME -f "$f" >/dev/null
|
|
else
|
|
echo "~> Saltando: $FILENAME ($FILE_VER) - Mayor que objetivo"
|
|
fi
|
|
done
|
|
|
|
# 4. Generar nombre de archivo de salida
|
|
OUTPUT_FILE="${OUTPUT_FILE_PREFIX}_v${TARGET_VERSION}.sql"
|
|
|
|
# 5. Extraer el esquema FINAL
|
|
echo "~> Generando $OUTPUT_FILE ---"
|
|
pg_dump -d $DB_NAME -s --no-owner --no-privileges >$OUTPUT_FILE
|
|
|
|
echo "o> Esquema guardado en $OUTPUT_FILE"
|