diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9fa65eb..82f314b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -77,23 +77,56 @@ canonize_rotation: # CI_COMMIT_SHA ist der Stand von main beim Anlegen der Pipeline. - git checkout -B main "$CI_COMMIT_SHA" - | + # Zeitpunkt der Rotation aus dem SOPS-Metadatenblock lesen. 'lastmodified' + # ist Metadatum, kein Geheimnis - es steht im Klartext neben den ENC[]-Werten. + rotationszeit() { + git show "$1:apps/production/coturn-secret.yaml" 2>/dev/null \ + | sed -n 's/^[[:space:]]*lastmodified:[[:space:]]*"\(.*\)".*/\1/p' | head -1 + } MERGED=0 + UEBERHOLT="" for ref in $(git for-each-ref --format='%(refname:short)' 'refs/remotes/gitea/turn-secret-rotation-*'); do SHA=$(git rev-parse "$ref") if git merge-base --is-ancestor "$SHA" HEAD; then echo "bereits kanonisiert: $ref" continue fi + # Ueberholte Zweige NICHT mergen. Ein Zweig, dessen Rotation aelter ist als + # der Stand in main, bringt nichts Neues, konfliktiert aber mit allem, was + # seither passiert ist - inklusive coturn-secret.yaml und + # synapse-turn-secret.yaml. Eine unbedachte Hand-Aufloesung wuerde das + # TURN-Shared-Secret ZURUECKDREHEN; Synapse und coturn waeren dann uneins + # und TURN tot. Real passiert: der Zweig vom 2026-07-28 blieb nach dem Merge + # auf Gitea liegen und hat diesen Job neun Tage lang taeglich rot gefaerbt - + # womit die rote Pipeline als Alarm wertlos wurde (AGENTS.md: sie IST der + # einzige Meldeweg). Deshalb ist ein Ueberbleibsel hier Aufraeumarbeit und + # kein Vorfall: gemeldet ja, rot nein. + NEU=$(rotationszeit "$SHA"); IST=$(rotationszeit HEAD) + if [ -n "$NEU" ] && [ -n "$IST" ] \ + && [ "$(printf '%s\n%s\n' "$NEU" "$IST" | sort | head -1)" = "$NEU" ]; then + echo "ueberholt: $ref traegt die Rotation vom $NEU, main steht auf $IST." + UEBERHOLT="$UEBERHOLT ${ref#gitea/}" + continue + fi echo "kanonisiere: $ref ($SHA)" SUBJ="chore(coturn): TURN-Rotation aus ${ref#gitea/} uebernommen" BODY="Automatisch kanonisiert: der Rotations-CronJob im Cluster erreicht git.lab nicht und pusht nach Gitea; dieser Commit bringt die Rotation auf den kanonischen Weg zurueck, bevor der Mirror sie ueberschreiben kann." if ! git merge --no-ff -m "$SUBJ" -m "$BODY" "$SHA"; then echo "MERGE-KONFLIKT in $ref - es wird nichts gepusht." - echo "Von Hand aufloesen, siehe CLAUDE.md (Abschnitt Repo Topology)." + echo "⚠️ Beim Aufloesen NIEMALS die aeltere Fassung von coturn-secret.yaml oder" + echo " synapse-turn-secret.yaml uebernehmen: beide muessen dasselbe Shared" + echo " Secret tragen, sonst faellt TURN aus. Im Zweifel main behalten." + echo "Siehe CLAUDE.md (Abschnitt Repo Topology)." exit 1 fi MERGED=1 done + if [ -n "$UEBERHOLT" ]; then + echo + echo "AUFRAEUMEN: diese Zweige sind ueberholt und koennen auf Gitea geloescht werden:" + for b in $UEBERHOLT; do echo " - $b"; done + echo "(Der Job bleibt gruen - liegengebliebene Zweige sind kein Vorfall.)" + fi echo "MERGED=$MERGED" > .canonize_state - | . ./.canonize_state