Files
scripts/promote-to-production.sh
devopsandClaude Sonnet 5 9d04c73b20 feat: bumpear APP_VERSION al promover a producción
Complementa el cambio en apps-registry (footer lee process.env.APP_VERSION
para mostrar la versión real desplegada) -- sin esto, promover a
Producción actualizaría la imagen pero dejaría el footer mostrando la
versión vieja.

Co-Authored-By: Claude Sonnet 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_012Y4df3Z7odr9Cg8F2nw6uV
2026-09-14 04:04:17 +00:00

65 lines
2.6 KiB
Bash
Executable File

#!/usr/bin/env bash
set -Eeuo pipefail
# Promueve el tag de imagen del frontend actualmente desplegado en Staging
# (workloads/ecommerce-staging/frontend/patches/deployment.yaml) al
# manifiesto real de Producción (workloads/ecommerce/frontend/patches/
# deployment.yaml). Es la contraparte manual del job "Actualizar
# Manifiesto GitOps (CD)" de .gitea/workflows/build.yaml, que desde
# 2026-09-14 solo actualiza Staging automáticamente en cada push a main.
#
# 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."