You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
43 lines
2.3 KiB
43 lines
2.3 KiB
#!/usr/bin/env bash
|
|
# Construye y prepara ambas aplicaciones en una versión inmutable.
|
|
# Uso: bash despliegue/desplegar.sh usuario@host [/var/www/senzapaura]
|
|
set -euo pipefail
|
|
DESTINO="${1:-}"
|
|
RUTA="${2:-/var/www/senzapaura}"
|
|
CLAVE="${SSH_CLAVE:-$HOME/.ssh/senzapaura_deploy}"
|
|
[[ "$DESTINO" =~ ^[A-Za-z0-9_.-]+@[A-Za-z0-9_.-]+$ ]] || { echo 'Indica usuario@servidor' >&2; exit 1; }
|
|
[[ "$RUTA" =~ ^/[A-Za-z0-9_/-]+$ && "$RUTA" != / && "$RUTA" != *..* ]] || { echo 'Ruta de despliegue no válida' >&2; exit 1; }
|
|
SSH=(ssh -i "$CLAVE" -o BatchMode=yes)
|
|
VERSION="$(date -u +%Y%m%dT%H%M%SZ)-$(git rev-parse --short HEAD)"
|
|
TEMPORAL="$(mktemp -d)"
|
|
trap 'rm -rf -- "$TEMPORAL"' EXIT
|
|
npm run check
|
|
npm run lint
|
|
npm run test:unit -- --run
|
|
# En producción no se acepta un empaquetador que termine con error.
|
|
npm run build
|
|
npm run build:panel
|
|
npm run build:estudio
|
|
[[ -f build/index.js && -f build-panel/index.js && -f build-estudio/index.js ]]
|
|
cp package.json package-lock.json "$TEMPORAL/"
|
|
(cd "$TEMPORAL" && npm ci --omit=dev --silent)
|
|
if find "$TEMPORAL/node_modules" -name '*.node' | grep -q .; then
|
|
echo 'Hay dependencias nativas: requieren una construcción Linux.' >&2; exit 1
|
|
fi
|
|
"${SSH[@]}" "$DESTINO" "mkdir -p '$RUTA/releases' '$RUTA/media/audio' '$RUTA/media/escucha' '$RUTA/media/ondas' '$RUTA/media/imagenes'; mkdir '$RUTA/releases/$VERSION'"
|
|
tar -czf - build build-panel build-estudio package.json package-lock.json drizzle scripts/db/migrar.mjs scripts/estudio despliegue |
|
|
"${SSH[@]}" "$DESTINO" "tar -xzf - -C '$RUTA/releases/$VERSION'"
|
|
tar -czf - -C "$TEMPORAL" node_modules | "${SSH[@]}" "$DESTINO" "tar -xzf - -C '$RUTA/releases/$VERSION'"
|
|
# Los medios se comparten y nunca se sobrescriben al publicar código.
|
|
# Una sustitución editorial se carga desde el panel con una clave nueva.
|
|
for CARPETA in audio escucha imagenes; do
|
|
if [[ -d "media/$CARPETA" ]]; then
|
|
tar -czf - -C "media/$CARPETA" . | "${SSH[@]}" "$DESTINO" "tar --skip-old-files -xzf - -C '$RUTA/media/$CARPETA'"
|
|
fi
|
|
done
|
|
if [[ -d static/ondas ]]; then
|
|
tar -czf - -C static/ondas . | "${SSH[@]}" "$DESTINO" "tar --skip-old-files -xzf - -C '$RUTA/media/ondas'"
|
|
fi
|
|
# La base objetivo se toma exclusivamente del entorno del servidor.
|
|
"${SSH[@]}" "$DESTINO" "bash '$RUTA/releases/$VERSION/despliegue/activar.sh' '$RUTA' '$VERSION'"
|