diff --git a/.gitea/workflows/build.yaml b/.gitea/workflows/build.yaml index 9fee965..df23802 100644 --- a/.gitea/workflows/build.yaml +++ b/.gitea/workflows/build.yaml @@ -129,9 +129,16 @@ jobs: # Cambio 2026-09-14: todo push a main promueve a STAGING # automaticamente (workloads/ecommerce-staging), no a Produccion # directo -- decision del usuario para dejar de probar cambios en - # vivo contra Prod. Promover a Produccion (workloads/ecommerce) es - # una accion manual aparte, ver scripts/promote-to-production.sh. + # vivo contra Prod. + # Cambio 2026-09-20: la promocion de Staging a Produccion (antes + # scripts/promote-to-production.sh, manual con confirmacion + # interactiva) ahora corre sola en este mismo job -- ver el step + # "Promover a Produccion (CD)" mas abajo, justo despues del de + # Staging. Decision explicita del usuario: cero gate humano entre + # Staging y Produccion. El script manual queda solo como + # herramienta de rollback/excepcion, ya no es el camino normal. MANIFEST_FILE: workloads/ecommerce-staging/frontend/patches/deployment.yaml + PROD_MANIFEST_FILE: workloads/ecommerce/frontend/patches/deployment.yaml KUSTOMIZE_DIR: workloads/ecommerce-staging/frontend IMAGE_NAME: gitea.cruzcloud.net/devops/ecommerce-frontend @@ -604,6 +611,48 @@ jobs: # sobrescribir commits ajenos o promocionar una versión antigua. git push origin HEAD:main + # Automatiza lo que antes era scripts/promote-to-production.sh (paso + # manual con confirmación interactiva, read -rp). Decisión del + # usuario 2026-09-20: cero pasos manuales entre Staging y + # Producción — la misma imagen que acaba de promocionar a Staging + # arriba se promueve sola a Producción, sin gate humano en el + # medio. Mismo sed/perl que el script manual (mismo MANIFEST, otro + # archivo), corriendo como un segundo commit separado justo + # después del de Staging — no se pisan en un solo commit porque + # Staging y Producción son releases conceptualmente distintos + # (permite revertir uno sin tocar el otro). + - name: Promover a Producción (CD) + if: steps.promotion.outputs.promote == 'true' + shell: bash + run: | + set -euo pipefail + + VERSION="${{ steps.vars.outputs.VERSION }}" + + git config user.name "Cristian Felipe" + git config user.email "cristiancruz0529@gmail.com" + + # Re-fetch: el step de Staging de arriba ya pusheó un commit a + # main en este mismo job -- sin este refresh, este checkout + # local queda un commit atrás y el push de abajo se rechaza. + git fetch origin main + git checkout -B main origin/main + + sed -i -E "s|(image: ${IMAGE_NAME}:).*|\1${VERSION}|g" "${PROD_MANIFEST_FILE}" + + perl -0777 -pi -e "s/(- name: APP_VERSION\n\s*value: ).*/\${1}${VERSION}/" "${PROD_MANIFEST_FILE}" + + git add "${PROD_MANIFEST_FILE}" + + if git diff --cached --quiet; then + echo "Producción ya está en ${VERSION}." + exit 0 + fi + + git commit -m "chore: promote ${VERSION} to production [skip ci]" + + git push origin HEAD:main + - name: Resumen del pipeline if: always() shell: bash