Files
CloudRecoveryAS/build-all.sh

132 lines
4.9 KiB
Bash
Executable File

#!/usr/bin/env bash
# =============================================================================
# CloudRestoreAS — build de TODO en una sola tarea (ejecutar desde WSL).
#
# Linux : build en Docker (ubuntu:22.04) -> dist/CloudRestoreAS (autocontenido)
# Windows: build vía powershell.exe -> build.ps1 -> dist/CloudRestoreAS.exe
# Paquete: dist/release/CloudRestoreAS-linux.tar.gz y CloudRestoreAS-win.zip
#
# Uso:
# ./build-all.sh # ambos + empaquetado
# ./build-all.sh --linux-only # solo Linux
# ./build-all.sh --windows-only # solo Windows
# ./build-all.sh --no-package # sin generar .tar.gz/.zip
# ./build-all.sh --clean # rebuild desde cero (borra venvs/bundled/dist)
# =============================================================================
set -uo pipefail
ROOT="$(cd "$(dirname "$0")" && pwd)"
cd "$ROOT"
DO_LINUX=1
DO_WINDOWS=1
DO_PACKAGE=1
DO_CLEAN=0
for arg in "$@"; do
case "$arg" in
--linux-only) DO_WINDOWS=0 ;;
--windows-only) DO_LINUX=0 ;;
--no-package) DO_PACKAGE=0 ;;
--clean) DO_CLEAN=1 ;;
-h|--help)
grep '^#' "$0" | grep -v '^#!' | sed 's/^# \{0,1\}//'; exit 0 ;;
*) echo "Opción desconocida: $arg" >&2; exit 2 ;;
esac
done
# --- helpers -----------------------------------------------------------------
BLUE='\033[36m'; GREEN='\033[32m'; YELLOW='\033[33m'; RED='\033[31m'; NC='\033[0m'
say() { echo -e "${BLUE}==>${NC} $*"; }
ok() { echo -e "${GREEN}OK:${NC} $*"; }
warn() { echo -e "${YELLOW}AVISO:${NC} $*" >&2; }
err() { echo -e "${RED}ERROR:${NC} $*" >&2; }
# SECONDS es incremental de bash; lo usamos para medir cada etapa.
stage_start() { STAGE_T0=$SECONDS; }
stage_end() { echo -e " (${1} en $((SECONDS - STAGE_T0))s)"; }
WIN_OK=0
LIN_OK=0
# --- limpieza opcional -------------------------------------------------------
if [[ "$DO_CLEAN" -eq 1 ]]; then
say "Limpieza (--clean): borrando venvs, bundled y dist"
# bundled/ y venv-linux los crea Docker como root; borrar vía contenedor.
if command -v docker >/dev/null 2>&1; then
docker run --rm -v "$ROOT:/app" ubuntu:22.04 bash -c \
'rm -rf /app/packaging/bundled/linux /app/venv-linux /app/dist/CloudRestoreAS /app/dist/release' \
>/dev/null 2>&1 || true
fi
rm -rf "$ROOT/venv-windows" "$ROOT/packaging/bundled/windows" \
"$ROOT/dist/CloudRestoreAS.exe" 2>/dev/null || true
ok "limpieza completada"
fi
# --- Build Linux (Docker) ----------------------------------------------------
if [[ "$DO_LINUX" -eq 1 ]]; then
say "Build Linux (Docker, autocontenido)"
stage_start
if ! command -v docker >/dev/null 2>&1; then
err "docker no disponible; no se puede construir Linux"
[[ "$DO_WINDOWS" -eq 0 ]] && exit 1
elif bash "$ROOT/packaging/scripts/docker-build-linux.sh"; then
if [[ -f "$ROOT/dist/CloudRestoreAS" ]]; then
LIN_OK=1; ok "dist/CloudRestoreAS"
else
err "el build Linux terminó sin binario"
fi
else
err "falló el build Linux"
fi
stage_end "Linux"
fi
# --- Build Windows (PowerShell -> build.ps1) ---------------------------------
if [[ "$DO_WINDOWS" -eq 1 ]]; then
say "Build Windows (PowerShell + build.ps1)"
stage_start
WIN_PATH="$(wslpath -w "$ROOT" 2>/dev/null || true)"
if command -v powershell.exe >/dev/null 2>&1 && [[ -n "$WIN_PATH" ]]; then
# build.ps1 auto-detecta el Python de Windows (Python313/312/311) y arma venv-windows.
powershell.exe -NoProfile -ExecutionPolicy Bypass -Command \
"Set-Location -LiteralPath '$WIN_PATH'; & .\\build.ps1"
PS_RC=$?
if [[ "$PS_RC" -eq 0 && -f "$ROOT/dist/CloudRestoreAS.exe" ]]; then
WIN_OK=1; ok "dist/CloudRestoreAS.exe"
else
err "falló el build Windows (código $PS_RC)"
[[ "$DO_LINUX" -eq 0 ]] && { stage_end "Windows"; exit 1; }
fi
else
warn "powershell.exe no disponible desde WSL; se omite el build Windows."
warn "Ejecuta build.ps1 en Windows para generar el .exe."
[[ "$DO_LINUX" -eq 0 ]] && exit 1
fi
stage_end "Windows"
fi
# --- Empaquetado -------------------------------------------------------------
if [[ "$DO_PACKAGE" -eq 1 ]]; then
say "Empaquetado (.tar.gz Linux / .zip Windows)"
stage_start
bash "$ROOT/packaging/scripts/package-release.sh" || warn "empaquetado con incidencias"
stage_end "Empaquetado"
fi
# --- Resumen -----------------------------------------------------------------
echo
say "Resumen"
[[ "$DO_LINUX" -eq 1 ]] && { [[ "$LIN_OK" -eq 1 ]] && ok "Linux regenerado" || err "Linux NO generado"; }
[[ "$DO_WINDOWS" -eq 1 ]] && { [[ "$WIN_OK" -eq 1 ]] && ok "Windows regenerado" || warn "Windows NO generado"; }
if [[ -d "$ROOT/dist/release" ]]; then
echo "Artefactos en dist/release/:"
ls -lh "$ROOT/dist/release" | awk 'NR>1 {print " " $9 " " $5}'
fi
# Éxito si todo lo solicitado se generó.
FAIL=0
[[ "$DO_LINUX" -eq 1 && "$LIN_OK" -ne 1 ]] && FAIL=1
[[ "$DO_WINDOWS" -eq 1 && "$WIN_OK" -ne 1 ]] && FAIL=1
exit $FAIL