#!/usr/bin/env bash set -Eeuo pipefail # OBSOLETO como camino normal desde 2026-09-20: la promoción de Staging a # Producción ahora corre sola dentro de .gitea/workflows/build.yaml (step # "Promover a Producción (CD)"), en el mismo job que ya despliega a # Staging -- decisión del usuario de eliminar el gate humano entre los # dos ambientes. En uso normal este script ya no hace nada (Producción # va a estar al día apenas termine el pipeline). # # Se conserva solo como herramienta de excepción/rollback manual -- # ej. forzar Producción a una versión de Staging vieja sin pasar por un # build nuevo. Mismo sed/perl que el step automático del pipeline, con # la diferencia de que este sí pide confirmación interactiva. # # Asume que este repo (scripts) y apps-registry están clonados como # hermanos bajo el mismo directorio del lab (mismo layout que # lab-cruzcloud/{apps-registry,platform-infra,scripts} en esta NAS). APPS_REGISTRY_DIR="${APPS_REGISTRY_DIR:-$(cd "$(dirname "${BASH_SOURCE[0]}")/../apps-registry" && pwd)}" STAGING_MANIFEST="${APPS_REGISTRY_DIR}/workloads/ecommerce-staging/frontend/patches/deployment.yaml" PROD_MANIFEST="${APPS_REGISTRY_DIR}/workloads/ecommerce/frontend/patches/deployment.yaml" IMAGE_NAME="gitea.cruzcloud.net/devops/ecommerce-frontend" test -d "${APPS_REGISTRY_DIR}/.git" || { echo "ERROR: no se encontró un checkout de apps-registry en ${APPS_REGISTRY_DIR}." echo "Definí APPS_REGISTRY_DIR=/ruta/al/checkout si no está junto a este repo." exit 1 } STAGING_VERSION="$(grep -oE "${IMAGE_NAME}:v[0-9.]+" "${STAGING_MANIFEST}" | head -1 | cut -d: -f2)" test -n "${STAGING_VERSION}" || { echo "ERROR: no se pudo leer la versión actual de Staging desde ${STAGING_MANIFEST}." exit 1 } CURRENT_PROD_VERSION="$(grep -oE "${IMAGE_NAME}:v[0-9.]+" "${PROD_MANIFEST}" | head -1 | cut -d: -f2)" echo "Staging: ${STAGING_VERSION}" echo "Producción: ${CURRENT_PROD_VERSION}" if [[ "${STAGING_VERSION}" == "${CURRENT_PROD_VERSION}" ]]; then echo "Producción ya está en ${STAGING_VERSION}. Nada que promover." exit 0 fi read -rp "¿Promover ${STAGING_VERSION} a Producción? [s/N] " CONFIRM [[ "${CONFIRM}" =~ ^[sS]$ ]] || { echo "Cancelado."; exit 1; } cd "${APPS_REGISTRY_DIR}" git fetch origin main git checkout -B main origin/main sed -i -E "s|(image: ${IMAGE_NAME}:).*|\1${STAGING_VERSION}|g" "${PROD_MANIFEST}" # Mismo bump que hace build.yaml en Staging -- el footer lee APP_VERSION # para mostrar la version real desplegada. perl -0777 -pi -e "s/(- name: APP_VERSION\n\s*value: ).*/\${1}${STAGING_VERSION}/" "${PROD_MANIFEST}" git add "${PROD_MANIFEST}" if git diff --cached --quiet; then echo "No hay cambios en el manifiesto de Producción." exit 0 fi git commit -m "chore: promote ${STAGING_VERSION} to production" git push origin HEAD:main echo "Promovido. Argo CD sincroniza ecommerce-app en unos segundos."