Files
scripts/promote-to-production.sh

77 lines
3.2 KiB
Bash
Executable File

#!/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. awk en vez de perl (usado en
# build.yaml, donde sí está disponible porque corre en un runner
# ubuntu-latest): el host real de ZimaOS donde se corre este script a
# mano no trae perl instalado (confirmado en vivo 2026-09-20), a
# diferencia de sed/awk que sí son parte del sistema base.
awk -v ver="${STAGING_VERSION}" '
/- name: APP_VERSION/ { print; getline; sub(/value:.*/, "value: " ver); print; next }
{ print }
' "${PROD_MANIFEST}" > "${PROD_MANIFEST}.tmp" && mv "${PROD_MANIFEST}.tmp" "${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."