77 lines
3.2 KiB
Bash
Executable File
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."
|