Compare commits

...
Author SHA1 Message Date
coder-agent 50f1e5e1b7 autodeploy r33: identidad de hardcap solo si el layout sirve la meta build-id + DM unico por incidente (dm_once/dm_clear)
ci / lint-test (pull_request) Successful in 7s
isolation-test / probe (pull_request) Successful in 0s
- 34 rollbacks (15:10-16:09 UTC) grep-eando un build-id que main no servia
  (gh#10 anade la meta; mientras, no se exige identidad y el deploy avanza).
- dm_once(subject): un DM por incidente; deploy exitoso limpia el subject.
  El journal sigue completo (say por ciclo).
2026-11-03 16:16:28 +00:00
ci-bot d55d8e91a2 Merge pull request 'autodeploy: rollback de hardcap en subshell (no bloquea bitcoinhotels)' (#64) from r32-autodeploy-subshell into main
ci / lint-test (push) Successful in 2s
2026-11-03 15:55:04 +00:00
coder-agent b9dcacd76e autodeploy: cierre de subshell antes del header de bitcoinhotels (cosmetico)
ci / lint-test (pull_request) Successful in 4s
isolation-test / probe (pull_request) Successful in 1s
2026-11-03 15:50:44 +00:00
coder-agent c17ac080cb autodeploy: seccion hardcap en subshell — su rollback no aborta los deploys de bitcoinhotels
ci / lint-test (pull_request) Successful in 7s
isolation-test / probe (pull_request) Successful in 1s
2026-11-03 15:50:11 +00:00
ci-bot fae57e3b4f Merge pull request 'reporte diario: PRs pendientes de merge + contenido nuevo por sitio + semanal AdSense' (#63) from r32-report into main
ci / lint-test (push) Successful in 2s
2026-11-03 15:20:03 +00:00
+24 -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" \
@@ -99,6 +109,10 @@ say "entity → $(git rev-parse --short HEAD) (tests $PASS/27, watcher OK, live)
# r21: sin DM (no urgente) — dm "entity desplegado: $(git rev-parse --short HEAD) — tests $PASS/27, watcher OK"
fi # fin sección entity
# r32: la seccion hardcap corre en SUBSHELL — un ROLLBACK (exit 1) ya no
# aborta los deploys de bitcoinhotels (bug: rollback de hardcap llevaba
# bloqueando bh desde las 15:10 mientras gh#10 espera merge)
(
# ── 2b. hardcap-news → /srv/hardcap-news (GitHub; web, sin PUBLISH_OFF) ─────
cd /srv/hardcap-news || { say "FATAL: sin /srv/hardcap-news"; exit 1; }
git fetch -q origin 2>/dev/null
@@ -112,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
@@ -120,23 +134,29 @@ 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
)
# ── 3. bitcoinhotels → /srv/bitcoinhotels (web; sin PUBLISH_OFF) ────────────
cd /srv/bitcoinhotels || { say "FATAL: sin /srv/bitcoinhotels"; exit 1; }
git fetch -q origin 2>/dev/null