autodeploy r33: identidad hardcap condicional + DM unico por incidente #65
@@ -7,6 +7,16 @@
|
|||||||
# Timer: cada 3 min. Fallo → DM al supervisor + logger. Nunca toca un tree sucio.
|
# Timer: cada 3 min. Fallo → DM al supervisor + logger. Nunca toca un tree sucio.
|
||||||
|
|
||||||
say() { echo "[autodeploy] $*"; logger -t cayce-autodeploy "$*"; }
|
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() {
|
dm() {
|
||||||
SUP=$(grep -aoE 'SUPERVISOR_NPUB_HEX=[0-9a-f]+' /srv/cayce-nostr/.env 2>/dev/null | cut -d= -f2)
|
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" \
|
[ -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
|
fi
|
||||||
if ! (cd frontend && npm run build >/tmp/hc-autodeploy-build.log 2>&1); then
|
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
|
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
|
exit 1
|
||||||
fi
|
fi
|
||||||
sudo -n systemctl restart hardcap-frontend.service
|
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/)
|
CODE=$(curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:3003/)
|
||||||
if [ "$CODE" != "200" ]; then
|
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
|
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
|
exit 1
|
||||||
fi
|
fi
|
||||||
# r24: identidad por build-id (cuando el despliegue trae la función)
|
# 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)
|
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)
|
WANT=$(git rev-parse --short=8 HEAD)
|
||||||
if [ "$BUILT" != "$WANT" ]; then
|
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
|
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
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
dm_clear "hardcap:build-id"; dm_clear "hardcap:rollback-build"; dm_clear "hardcap:rollback-code"
|
||||||
say "identidad hardcap OK: servido=$BUILT desplegado=$WANT"
|
say "identidad hardcap OK: servido=$BUILT desplegado=$WANT"
|
||||||
fi
|
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)"
|
say "hardcap-news → $(git rev-parse --short HEAD) (200)"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user