From 39c65cf9def21a2f6f0a972436e4499394d44108 Mon Sep 17 00:00:00 2001 From: Waters Church Date: Thu, 24 Sep 2026 16:11:22 -0400 Subject: [PATCH] Make the website deploy report its own failures MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The deploy was the one pipeline with no failure notification. It either worked or you found out by noticing the site was stale — the same shape as the off-site backup before today. alert.js now takes CHECKLIST_ENV_FILE and CHECKLIST_NODE_MODULES, because the deploy job runs in a container that has the repo but no server/.env and no node_modules; both live on the NAS at the mounted deploy directory. What this still does not catch, and the reason it is written down in the workflow: a runner that wedges. Today the NAS runner claimed run 7, executed none of its six steps, and Gitea timed it out fifteen minutes later — every step was marked failed without one having run, so no in-job step could have reported it. The container said "Up 2 hours" throughout and admitted on restart that it had been holding the job. A stuck runner looks exactly like a slow one, and catching it needs something watching from outside the run. Co-Authored-By: Claude Opus 5 --- .gitea/workflows/deploy.yml | 25 +++++++++++++++++++++++++ scripts/alert.js | 10 +++++++--- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index 414a3b4..4fe4c42 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -88,3 +88,28 @@ jobs: docker ps --filter name=recurring-checklist --format '{{.Names}} {{.Status}}' docker logs --tail 30 recurring-checklist exit 1 + + - name: Tell Christian the deploy broke + # The web deploy had no failure notification at all until now, which is the same + # silent-failure shape as the backup: it either worked or you found out by looking. + # + # NOT covered by this: a runner that wedges. On 2026-09-24 the NAS runner claimed + # this job, ran none of its six steps, and Gitea timed it out — no step ran, so no + # step could report. Catching that needs something watching from outside the run. + if: failure() + run: | + D=/volume2/docker/recurring-checklist + BODY_FILE="$(mktemp)" + cat > "$BODY_FILE" <