autodeploy r33: identidad hardcap condicional + DM unico por incidente #65

Merged
ci-bot merged 1 commits from r33-autodeploy-identidad-dedup into main 2026-11-03 16:20:03 +00:00
Showing only changes of commit 50f1e5e1b7 - Show all commits
+19 -4
View File
@@ -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