Release-Workflow: Changelog-Body-Parser frisst Block mit em-dash nicht #3

Open
opened 2026-05-28 07:03:02 +00:00 by claude · 0 comments
Owner

Symptom

Beim Release idf-quest v0.1.0 (2026-05-28) lief release-plugin.yml@v1 zwar grün durch, aber im Workflow-Log stand:

Changelog-Block extrahiert (0 Zeichen).

Folge: das Gitea-Release wurde mit leerem Body angelegt.

Ursache (vermutlich)

Der Python-Regex im Step „Changelog-Block aus CHANGELOG.md extrahieren":

pat = re.compile(
    r"^##\s+v" + re.escape(version) + r"(?:\s+.*)?$\n(.*?)(?=^##\s+v\d|^---\s*$|\Z)",
    re.MULTILINE | re.DOTALL,
)

Der CHANGELOG-Header lautet ## v0.1.0 — 2026-05-28 (em-dash , U+2014). Trotz (?:\s+.*)? matcht der Regex den Block nicht — vermutlich weil das Match an $\n direkt am Header-Ende stranded. Konsistente Beobachtung: Pre-Flight-Check „Changelog-Header" findet die Zeile (separate Regex), aber der Body-Extraktor liefert 0 Zeichen.

Reproduktion

ideenfabrik/idf-quest Release v0.1.0 (Build-Run #266). CHANGELOG.md Header wie oben.

Erwartet

Der Block ab ### Hinzugefügt bis zum nächsten ## v… oder EOF wird extrahiert und als Release-Body verwendet.

Fix-Vorschlag

Regex robust gegen alles in der Header-Zeile machen, z.B.:

pat = re.compile(
    r"^##\s+v" + re.escape(version) + r"[^\n]*\n+(.*?)(?=^##\s+v\d|^---\s*$|\Z)",
    re.MULTILINE | re.DOTALL,
)

([^\n]*\n+ statt (?:\s+.*)?$\n toleriert Trennzeichen und optionale Leerzeilen direkt nach dem Header.)

Refs

**Symptom** Beim Release `idf-quest v0.1.0` (2026-05-28) lief `release-plugin.yml@v1` zwar grün durch, aber im Workflow-Log stand: ``` Changelog-Block extrahiert (0 Zeichen). ``` Folge: das Gitea-Release wurde mit leerem Body angelegt. **Ursache (vermutlich)** Der Python-Regex im Step „Changelog-Block aus CHANGELOG.md extrahieren": ```python pat = re.compile( r"^##\s+v" + re.escape(version) + r"(?:\s+.*)?$\n(.*?)(?=^##\s+v\d|^---\s*$|\Z)", re.MULTILINE | re.DOTALL, ) ``` Der CHANGELOG-Header lautet `## v0.1.0 — 2026-05-28` (em-dash `—`, U+2014). Trotz `(?:\s+.*)?` matcht der Regex den Block nicht — vermutlich weil das Match an `$\n` direkt am Header-Ende stranded. Konsistente Beobachtung: Pre-Flight-Check „Changelog-Header" findet die Zeile (separate Regex), aber der Body-Extraktor liefert 0 Zeichen. **Reproduktion** `ideenfabrik/idf-quest` Release v0.1.0 (Build-Run #266). CHANGELOG.md Header wie oben. **Erwartet** Der Block ab `### Hinzugefügt` bis zum nächsten `## v…` oder EOF wird extrahiert und als Release-Body verwendet. **Fix-Vorschlag** Regex robust gegen alles in der Header-Zeile machen, z.B.: ```python pat = re.compile( r"^##\s+v" + re.escape(version) + r"[^\n]*\n+(.*?)(?=^##\s+v\d|^---\s*$|\Z)", re.MULTILINE | re.DOTALL, ) ``` (`[^\n]*\n+` statt `(?:\s+.*)?$\n` toleriert Trennzeichen und optionale Leerzeilen direkt nach dem Header.) **Refs** - Plugin: `ideenfabrik/idf-quest` v0.1.0 - Workflow-Run: https://git.ihre-ideenfabrik.de/ideenfabrik/idf-quest/actions/runs/266 - Release mit leerem Body: https://git.ihre-ideenfabrik.de/ideenfabrik/idf-quest/releases/tag/v0.1.0
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: ideenfabrik/idf-ci#3