From 8a90b7507e340f135c11352752df402b6e114f8a Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Wed, 22 Jul 2026 22:27:05 +0200 Subject: [PATCH] Ampel-Waechter: Status-Luegen-Wache (Job-Log = Wahrheit) Alter Runner (0.2.13) meldete Abschluesse nicht -> Gitea zombie-markierte gruene Jobs als failure. Waechter prueft jetzt vor Alarm das Job-Log auf "Job succeeded". Runner auf 0.6.1 gehoben (eigentlicher Fix). Co-Authored-By: Claude Opus 4.8 --- deploy/ampel-waechter.sh | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/deploy/ampel-waechter.sh b/deploy/ampel-waechter.sh index 2ae49bf..439003c 100644 --- a/deploy/ampel-waechter.sh +++ b/deploy/ampel-waechter.sh @@ -49,7 +49,20 @@ for repo in repos: kennung = f"{full}#{t.get('id')}" status = t.get("status") if status == "failure" and kennung not in gesehen: - neu.append((full, t.get("head_sha", "")[:7], t.get("name", ""))) + # Status-Lügen-Wache (Fund 22.07.): alter Runner meldete Abschluss nicht, + # Gitea zombie-markierte GRÜNE Jobs als failure. Das Job-LOG ist die + # Wahrheit — steht dort „Job succeeded", ist es KEIN Alarm. + try: + req = urllib.request.Request( + f"{BASE}/repos/{full}/actions/jobs/{t.get('id')}/logs", + headers={"Authorization": "token " + token}) + with urllib.request.urlopen(req, timeout=20) as r: + log_ende = r.read().decode(errors="replace")[-4000:] + wirklich_rot = "Job succeeded" not in log_ende + except Exception: + wirklich_rot = True + if wirklich_rot: + neu.append((full, t.get("head_sha", "")[:7], t.get("name", ""))) # Nur ABGESCHLOSSENE Läufe merken — ein 'running', das später rot wird, # darf nicht schon als gesehen gelten. if status in ("failure", "success", "cancelled", "skipped"):