#!/usr/bin/env bash set -euo pipefail SCRIPT_VERSION="0.0.3" # ===================================================== # FACTUGES Document Signing Service Build Script # ----------------------------------------------------- # Build + Subida a producción de la imagen Docker # ===================================================== # Uso: # ./build_docker.sh [--load] # # ===================================================== # --- Configuración base --- COMPANY="" LOAD=false # --- Validar que el primer argumento existe y no es un flag --- if [[ $# -eq 0 || "$1" == --* ]]; then echo "❌ ERROR: Falta el parámetro " echo "Uso: ./build_docker.sh [--load]" echo "Ejemplos:" echo " ./build_docker.sh acme --load" exit 1 fi COMPANY="$1" SSH_USER="rodax" SSH_HOST="vps-2.rodax-software.com" SSH_PORT="49152" # Override por compañía específica if [[ "$COMPANY" == "rodax" ]]; then SSH_USER="rodax" SSH_HOST="factuges.rodax-software.local" SSH_PORT="22" fi # --- Parseo de flags --- shift # quitamos el , ahora solo quedan flags for arg in "$@"; do case "$arg" in --load) LOAD=true ;; *) echo "⚠️ Argumento desconocido: $arg" ;; esac done # --- Paths base --- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_DIR="$(realpath "${SCRIPT_DIR}/..")" OUT_DIR="${PROJECT_DIR}/build/" if [[ -z "$COMPANY" ]]; then echo "❌ Error: debes indicar la compañía. Ejemplo: ./build_docker.sh acme [--load]" exit 1 fi if [[ $COMPANY =~ --.* ]]; then echo "❌ Error: debes indicar la compañía. Ejemplo: ./build_docker.sh acme [--load]" exit 1 fi # --- Detectar nombre y versión de la API --- IMAGE_NAME=$(node -p "require('${PROJECT_DIR}/setup.cfg').name" 2>/dev/null || echo "factuges-document-signing-service") IMAGE_VERSION=$(node -p "require('${PROJECT_DIR}/setup.cfg').version" 2>/dev/null || echo "0.1.2") PORT="8000" # valor por defecto # --- 3. Etiquetas e información --- DATE=$(date +'%Y%m%d-%H%M%S') ISO_DATE=$(date -u +"%Y-%m-%dT%H:%M:%SZ") USER_NAME=$(whoami) GIT_HASH=$(git -C "$PROJECT_DIR" rev-parse --short HEAD 2>/dev/null || echo "unknown") GIT_BRANCH=$(git -C "$PROJECT_DIR" rev-parse --abbrev-ref HEAD 2>/dev/null || echo "unknown") IMAGE_TAG_V="${IMAGE_NAME}:v${IMAGE_VERSION}" IMAGE_TAG_LATEST="${IMAGE_NAME}:latest" mkdir -p "$OUT_DIR" rm -rf "${OUT_DIR:?}/"* echo "" echo "-------------------------------------------------------" echo " FACTUGES Document Signing Service Build Script v${SCRIPT_VERSION}" echo " Compañía: ${COMPANY}" echo " Proyecto: ${IMAGE_NAME}" echo " Versión: ${IMAGE_VERSION}" echo " Puerto: ${PORT}" echo " Etiquetas: ${IMAGE_TAG_V}, ${IMAGE_TAG_LATEST}" echo " Dir. out: ${OUT_DIR}" echo " Cargar: ${LOAD}" echo "-------------------------------------------------------" cd "${PROJECT_DIR}" echo "🐳 Construyendo imagen Docker..." docker build \ -t "${IMAGE_TAG_V}" -t "${IMAGE_TAG_LATEST}" \ --build-arg PORT="${PORT}" \ -f "${PROJECT_DIR}/Dockerfile" "${PROJECT_DIR}" echo "✅ Imagen Docker construida correctamente" TAR_FILE_V="${OUT_DIR}/${IMAGE_NAME}-v${IMAGE_VERSION}-${DATE}.tar" echo "🐳 Guardando imagen Docker ${TAR_FILE_V} ..." docker save "${IMAGE_TAG_V}" "${IMAGE_TAG_LATEST}" -o "${TAR_FILE_V}" echo "📦 Imagen guardada:" echo " ${TAR_FILE_V}" if [[ "$LOAD" == true ]]; then echo "📥 Cargando imagen en producción ${SSH_HOST}..." scp -r -P "${SSH_PORT}" "${OUT_DIR}" "${SSH_USER}@${SSH_HOST}:/opt/factuges-document-signing-service/" RESULT=$(ssh -p "${SSH_PORT}" "${SSH_USER}@${SSH_HOST}" \ "docker load -i /opt/factuges-document-signing-service/build/$(basename "${TAR_FILE_V}") && \ docker tag ${IMAGE_TAG_V} ${IMAGE_TAG_LATEST} " 2>&1) echo "${RESULT}" echo "✅ Imagen cargada en producción" fi # ===================================================== # 3️⃣ Resumen # ===================================================== echo "-------------------------------------------------------" echo "🎯 Resultado final para '${COMPANY}'" echo " 🐳 v${IMAGE_VERSION} → ${OUT_DIR}" echo "🧩 Script version: ${SCRIPT_VERSION} - FIN" echo "-------------------------------------------------------" echo "" echo "" echo ""