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"):