diff --git a/deploy/usr-local-bin/cayce-autodeploy b/deploy/usr-local-bin/cayce-autodeploy index 155ad13..f90067c 100755 --- a/deploy/usr-local-bin/cayce-autodeploy +++ b/deploy/usr-local-bin/cayce-autodeploy @@ -7,6 +7,16 @@ # Timer: cada 3 min. Fallo → DM al supervisor + logger. Nunca toca un tree sucio. say() { echo "[autodeploy] $*"; logger -t cayce-autodeploy "$*"; } +# r33: un rollback repetido avisa UNA vez por incidente (subject = repo:causa); +# el journal sigue completo (say por ciclo). Un deploy exitoso limpia el subject. +dm_once() { # $1 subject, $2 mensaje + local flag="/var/lib/cayce/autodeploy-alerts/$1" + if [ -e "$flag" ]; then say "DM suprimido (incidente ya avisado): $1"; return 0; fi + mkdir -p /var/lib/cayce/autodeploy-alerts 2>/dev/null || true + touch "$flag" 2>/dev/null || true + dm "$2" +} +dm_clear() { rm -f "/var/lib/cayce/autodeploy-alerts/$1" 2>/dev/null || true; } dm() { SUP=$(grep -aoE 'SUPERVISOR_NPUB_HEX=[0-9a-f]+' /srv/cayce-nostr/.env 2>/dev/null | cut -d= -f2) [ -n "$SUP" ] && curl -s -X POST http://127.0.0.1:3011/dm -H "Content-Type: application/json" \ @@ -116,7 +126,7 @@ if ! git merge-base --is-ancestor origin/main HEAD 2>/dev/null && [ -z "$(git st fi if ! (cd frontend && npm run build >/tmp/hc-autodeploy-build.log 2>&1); then git reset -q --hard "$OLD"; (cd frontend && npm run build >/dev/null 2>&1); sudo -n systemctl restart hardcap-frontend.service - say "ROLLBACK hardcap-news: fallo el build"; dm "ROLLBACK hardcap-news (build) — main NO desplegado, rollback activo" + say "ROLLBACK hardcap-news: fallo el build"; dm_once "hardcap:rollback-build" "ROLLBACK hardcap-news (build) — main NO desplegado, rollback activo (aviso unico)" exit 1 fi sudo -n systemctl restart hardcap-frontend.service @@ -124,20 +134,25 @@ if ! git merge-base --is-ancestor origin/main HEAD 2>/dev/null && [ -z "$(git st CODE=$(curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:3003/) if [ "$CODE" != "200" ]; then git reset -q --hard "$OLD"; (cd frontend && npm run build >/dev/null 2>&1); sudo -n systemctl restart hardcap-frontend.service - say "ROLLBACK hardcap-news: verificacion (code=$CODE)"; dm "ROLLBACK hardcap-news verificacion: code=$CODE — rollback activo" + say "ROLLBACK hardcap-news: verificacion (code=$CODE)"; dm_once "hardcap:rollback-code" "ROLLBACK hardcap-news verificacion: code=$CODE — rollback activo (aviso unico)" exit 1 fi # r24: identidad por build-id (cuando el despliegue trae la función) - if git grep -q "NEXT_PUBLIC_BUILD_ID" -- frontend/src/app/layout.tsx frontend/next.config.js 2>/dev/null; then + # r33: la identidad de hardcap solo se exige si ESTE main renderiza la meta + # build-id (gh#10 la anade al layout). Mientras no exista, no exigir identidad + # (loop del 2026-11-03: 34 rollbacks grep-eando un build-id que main no servia). + if git grep -q "name=.build-id." -- frontend/src/app/layout.tsx 2>/dev/null; then BUILT=$(curl -s -m 8 http://127.0.0.1:3003/ | grep -oE 'name="build-id" content="[a-f0-9]{8}"' | grep -oE '[a-f0-9]{8}' | head -1) WANT=$(git rev-parse --short=8 HEAD) if [ "$BUILT" != "$WANT" ]; then git reset -q --hard "$OLD"; (cd frontend && npm run build >/dev/null 2>&1); sudo -n systemctl restart hardcap-frontend.service - say "ROLLBACK hardcap-news: build-id '$BUILT' != '$WANT'"; dm "ROLLBACK hardcap-news: servia build '$BUILT' pero lo desplegado era '$WANT'." + say "ROLLBACK hardcap-news: build-id '$BUILT' != '$WANT'"; dm_once "hardcap:build-id" "ROLLBACK hardcap-news: servia build '$BUILT' pero lo desplegado era '$WANT'. Hasta mergear gh#10 (meta build-id) el check de identidad no se exige; aviso unico." exit 1 fi + dm_clear "hardcap:build-id"; dm_clear "hardcap:rollback-build"; dm_clear "hardcap:rollback-code" say "identidad hardcap OK: servido=$BUILT desplegado=$WANT" fi + dm_clear "hardcap:build-id"; dm_clear "hardcap:rollback-build"; dm_clear "hardcap:rollback-code" say "hardcap-news → $(git rev-parse --short HEAD) (200)" fi