From 973391ec68d0e587543444831e8cbdfa1c79bd8a Mon Sep 17 00:00:00 2001 From: david Date: Sun, 30 Nov 2025 12:25:10 +0100 Subject: [PATCH] =?UTF-8?q?Subida=20a=20producci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile => Dockerfile.factuges | 2 +- Dockerfile.verifactu | 31 +++++++ cronjob | 6 -- scripts/build-factuges-sync.sh | 149 ++++++++++++++++++++++++++++++ scripts/build.sh | 113 ---------------------- scripts/cronjob | 13 +++ scripts/deploy-cron.sh | 45 +++++++++ scripts/release.sh | 19 ---- 8 files changed, 239 insertions(+), 139 deletions(-) rename Dockerfile => Dockerfile.factuges (94%) create mode 100644 Dockerfile.verifactu delete mode 100644 cronjob create mode 100755 scripts/build-factuges-sync.sh delete mode 100755 scripts/build.sh create mode 100644 scripts/cronjob create mode 100755 scripts/deploy-cron.sh delete mode 100644 scripts/release.sh diff --git a/Dockerfile b/Dockerfile.factuges similarity index 94% rename from Dockerfile rename to Dockerfile.factuges index 122f453..11a6207 100644 --- a/Dockerfile +++ b/Dockerfile.factuges @@ -28,4 +28,4 @@ RUN pip install --no-cache-dir . # Entrypoint genérico #CMD ["python", "-m", "sync_factuges_main"] -CMD ["factuges-sync"] +CMD ["factuges-sync", "factuges"] diff --git a/Dockerfile.verifactu b/Dockerfile.verifactu new file mode 100644 index 0000000..73565be --- /dev/null +++ b/Dockerfile.verifactu @@ -0,0 +1,31 @@ +# syntax=docker/dockerfile:1.4 + +# Usa una imagen base de Python +FROM python:3.11-slim + +ENV PYTHONDONTWRITEBYTECODE=1 \ + PYTHONUNBUFFERED=1 \ + APP_HOME="/app" + + +WORKDIR ${APP_HOME} + +# Instalar librerías cliente Firebird +RUN apt-get update +RUN apt-get install libfbclient2 -y + +# Copiamos solo lo necesario para instalar el paquete +COPY pyproject.toml setup.cfg README.md ./ +COPY app ./app + +RUN pip install --no-cache-dir . + +# Copiar enviroment (se sobreescribe en compose) +#COPY enviroment/ ./enviroment + +# Volumen para logs persistentes +#VOLUME ["/app/logs"] + +# Entrypoint genérico +#CMD ["python", "-m", "sync_factuges_main"] +CMD ["factuges-sync", "verifactu"] diff --git a/cronjob b/cronjob deleted file mode 100644 index ad18897..0000000 --- a/cronjob +++ /dev/null @@ -1,6 +0,0 @@ -*/5 * * * * /usr/local/bin/python /opt/uecko_sync_app/app/main.py >> /var/log/cron.log 2>&1 - -*/5 * * * * docker run --rm \ - --env-file /opt/my_project/config/prod.env \ - -v /opt/my_project/logs:/app/logs \ - my_project:latest diff --git a/scripts/build-factuges-sync.sh b/scripts/build-factuges-sync.sh new file mode 100755 index 0000000..fdc362c --- /dev/null +++ b/scripts/build-factuges-sync.sh @@ -0,0 +1,149 @@ +#!/usr/bin/env bash +set -euo pipefail + +SCRIPT_VERSION="1.1.0" + +# ================================================ +# FACTUGES SYNC - Docker Build Script +# ----------------------------------------------- +# Uso: +# ./build.sh [--load] +# ================================================ + +# ---------- 1. Validación ---------- +if [[ $# -eq 0 || "$1" == --* ]]; then + echo "❌ ERROR: Falta el parámetro " + echo "Uso: ./build.sh [--load]" + exit 1 +fi + +COMPANY="$1" +LOAD=false +[[ "${2:-}" == "--load" ]] && LOAD=true + +# ---------- 2. Directorios ---------- +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_DIR="$(realpath "${SCRIPT_DIR}/..")" +OUT_DIR="${PROJECT_DIR}/out/${COMPANY}" + +mkdir -p "$OUT_DIR" + +# ---------- 3. Info ---------- +DATE=$(date +'%Y%m%d-%H%M%S') +ISO_DATE=$(date -u +"%Y-%m-%dT%H:%M:%SZ") +USER_NAME=$(whoami) + +IMAGE_VERSION=$(sed -n 's/^version[[:space:]]*=[[:space:]]*\(.*\)$/\1/p' "$PROJECT_DIR/setup.cfg" | head -n1) +IMAGE_VERSION="${IMAGE_VERSION:-0.0.0}" + +echo "" +echo "-------------------------------------------------------" +echo " FACTUGES SYNC Build Script v${SCRIPT_VERSION}" +echo " Compañía: ${COMPANY}" +echo " Versión: ${IMAGE_VERSION}" +echo " Fecha: ${DATE}" +echo "-------------------------------------------------------" +echo "" + +# ---------- 4. Función para generar 1 build ---------- +build_image() { + local MODE="$1" # factuges | verifactu + + local IMAGE_NAME="factuges-sync-${MODE}" + + local TAG_VERSION="${IMAGE_NAME}:${COMPANY}-${IMAGE_VERSION}" + local TAG_LATEST="${IMAGE_NAME}:${COMPANY}-latest" + + echo "📦 Construyendo imagen Docker (${MODE})..." + + docker build --no-cache \ + -t "${TAG_VERSION}" \ + -t "${TAG_LATEST}" \ + --build-arg COMPANY="${COMPANY}" \ + -f "${PROJECT_DIR}/Dockerfile.${MODE}" "${PROJECT_DIR}" + + echo "✅ Imagen construida: ${TAG_VERSION}" + + local TAR_V="${OUT_DIR}/${IMAGE_NAME}-${COMPANY}-v${IMAGE_VERSION}-${DATE}.tar" + local TAR_LATEST="${OUT_DIR}/${IMAGE_NAME}-${COMPANY}-latest.tar" + + docker save -o "${TAR_V}" "${TAG_VERSION}" "${TAG_LATEST}" + cp -f "${TAR_V}" "${TAR_LATEST}" + + echo "📦 Imagen guardada:" + echo " - ${TAR_V}" + echo " - ${TAR_LATEST}" + + # Exportamos variables a nivel global para el LOAD opcional + echo "${TAR_V}" + echo "${TAR_LATEST}" + + echo "${TAR_V}|${TAR_LATEST}" +} + +# ---------- 5. Ejecutar build para ambos modos ---------- +BUILD_OUT_FACTUGES=$(build_image "factuges") +FACTUGES_TAR_V=$(echo "$BUILD_OUT_FACTUGES" | cut -d '|' -f1) +FACTUGES_TAR_LATEST=$(echo "$BUILD_OUT_FACTUGES" | cut -d '|' -f2) + +BUILD_OUT_VERIFACTU=$(build_image "verifactu") +VERIFACTU_TAR_V=$(echo "$BUILD_OUT_VERIFACTU" | cut -d '|' -f1) +VERIFACTU_TAR_LATEST=$(echo "$BUILD_OUT_VERIFACTU" | cut -d '|' -f2) + +# ---------- 6. Manifest ---------- +MANIFEST_FILE="${OUT_DIR}/manifest-${IMAGE_VERSION}-${DATE}.json" +cat > "${MANIFEST_FILE}" < [--load] -# ================================================ - -# ---------- 1. Validación de parámetros ---------- -if [[ $# -eq 0 || "$1" == --* ]]; then - echo "❌ ERROR: Falta el parámetro " - echo "Uso: ./build.sh [--load]" - exit 1 -fi - -COMPANY="$1" -LOAD=false - -if [[ "${2:-}" == "--load" ]]; then - LOAD=true -fi - -# ---------- 2. Directorios ---------- -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -PROJECT_DIR="$(realpath "${SCRIPT_DIR}/..")" -OUT_DIR="${PROJECT_DIR}/out/${COMPANY}" - -mkdir -p "$OUT_DIR" -cd "$PROJECT_DIR" - -# ---------- 3. Versión del proyecto ---------- -IMAGE_NAME="factuges-sync" - -IMAGE_VERSION=$(sed -n 's/^version[[:space:]]*=[[:space:]]*\(.*\)$/\1/p' setup.cfg | head -n1) -IMAGE_VERSION="${IMAGE_VERSION:-0.0.0}" - -IMAGE_TAG_VERSION="${IMAGE_NAME}:${COMPANY}-${IMAGE_VERSION}" -IMAGE_TAG_LATEST="${IMAGE_NAME}:${COMPANY}-latest" - -# ---------- 4. Info del sistema ---------- -DATE=$(date +'%Y%m%d-%H%M%S') -ISO_DATE=$(date -u +"%Y-%m-%dT%H:%M:%SZ") -USER_NAME=$(whoami) - -echo "" -echo "-------------------------------------------------------" -echo " FACTUGES SYNC Build Script v${SCRIPT_VERSION}" -echo " Compañía: ${COMPANY}" -echo " Version: ${IMAGE_VERSION}" -echo " Imagen: ${IMAGE_TAG_VERSION}" -echo " Latest tag: ${IMAGE_TAG_LATEST}" -echo " Load: ${LOAD}" -echo "-------------------------------------------------------" -echo "" - -# ---------- 5. Build de la imagen Docker ---------- -echo "📦 Construyendo imagen Docker..." -docker build \ - -t "${IMAGE_TAG_VERSION}" \ - -t "${IMAGE_TAG_LATEST}" \ - . - -echo "✔ Build OK: ${IMAGE_TAG_VERSION}" -echo "" - -# ---------- 6. Generar manifest JSON ---------- -MANIFEST_FILE="${OUT_DIR}/manifest-${IMAGE_VERSION}-${DATE}.json" - -cat > "$MANIFEST_FILE" <> /var/log/factuges-sync/factuges.log 2>&1 + +# Sincronización Verifactu → cada 7 minutos +*/7 * * * * docker run --rm \ + -e ENV=prod \ + factuges-sync-verifactu:acme-latest \ + >> /var/log/factuges-sync/verifactu.log 2>&1 diff --git a/scripts/deploy-cron.sh b/scripts/deploy-cron.sh new file mode 100755 index 0000000..6952c7f --- /dev/null +++ b/scripts/deploy-cron.sh @@ -0,0 +1,45 @@ +#!/usr/bin/env bash +set -euo pipefail + +# ================================================ +# FACTUGES SYNC - Deploy cron jobs +# ----------------------------------------------- +# Este script: +# - Crea /var/log/factuges-sync +# - Instala los cron jobs de producción +# - Mantiene los cron jobs idempotentes +# ================================================ + +COMPANY="${1:-acme}" + +CRON_FILE="/tmp/factuges-sync-cron-${COMPANY}.txt" + +echo "📄 Generando cron file temporal: ${CRON_FILE}" + +mkdir -p /var/log/factuges-sync + +cat > "$CRON_FILE" <> /var/log/factuges-sync/factuges.log 2>&1 + +# Sincronización Verifactu → cada 7 minutos +*/7 * * * * docker run --rm \ + -e ENV=prod \ + factuges-sync-verifactu:${COMPANY}-latest \ + >> /var/log/factuges-sync/verifactu.log 2>&1 +EOF + +echo "📥 Instalando cron jobs del sistema..." + +crontab "$CRON_FILE" + +echo "---------------------------------------------" +echo "✔ Cron jobs instalados correctamente" +echo "✔ Logs → /var/log/factuges-sync/" +echo "✔ Puedes comprobar con: crontab -l" +echo "---------------------------------------------" diff --git a/scripts/release.sh b/scripts/release.sh deleted file mode 100644 index 0b27507..0000000 --- a/scripts/release.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -# Comentario: genera el siguiente tag semántico automáticamente -# Formato: major.minor.patch - -CURRENT=$(git describe --tags --abbrev=0 2>/dev/null || echo "0.0.0") - -IFS='.' read -r MAJ MIN PAT <<< "$CURRENT" - -# Incremento patch por defecto -PAT=$((PAT + 1)) - -NEXT="${MAJ}.${MIN}.${PAT}" - -echo "Creating release tag: ${NEXT}" - -git tag "${NEXT}" -git push origin "${NEXT}"