ci: derive release notes from CHANGELOG.md

This commit is contained in:
2025-10-17 01:08:57 +02:00
parent e2a31b192f
commit 438b05b8a3
2 changed files with 63 additions and 1 deletions

View File

@@ -146,6 +146,11 @@ steps:
sha256sum ${ARTIFACT}.tar.gz > ${ARTIFACT}.tar.gz.sha256 sha256sum ${ARTIFACT}.tar.gz > ${ARTIFACT}.tar.gz.sha256
fi fi
- name: release-notes
image: *rust_image
commands:
- scripts/release-notes.sh "${CI_COMMIT_TAG}" release-notes.md
- name: release - name: release
image: plugins/gitea-release image: plugins/gitea-release
settings: settings:
@@ -158,4 +163,4 @@ steps:
- ${ARTIFACT}.zip - ${ARTIFACT}.zip
- ${ARTIFACT}.zip.sha256 - ${ARTIFACT}.zip.sha256
title: Release ${CI_COMMIT_TAG} title: Release ${CI_COMMIT_TAG}
note: "Release ${CI_COMMIT_TAG}" note_file: release-notes.md

57
scripts/release-notes.sh Executable file
View File

@@ -0,0 +1,57 @@
#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
CHANGELOG="${REPO_ROOT}/CHANGELOG.md"
TAG="${1:-}"
OUTPUT="${2:-}"
if [[ -z "${TAG}" ]]; then
echo "usage: $0 <tag> [output-file]" >&2
exit 1
fi
TAG="${TAG#v}"
TAG="${TAG#V}"
if [[ ! -f "${CHANGELOG}" ]]; then
echo "error: CHANGELOG.md not found at ${CHANGELOG}" >&2
exit 1
fi
NOTES=$(TAG="${TAG}" CHANGELOG_PATH="${CHANGELOG}" python - <<'PY'
import os
import re
import sys
from pathlib import Path
changelog_path = Path(os.environ['CHANGELOG_PATH'])
tag = os.environ['TAG']
text = changelog_path.read_text(encoding='utf-8')
pattern = re.compile(rf'^## \[{re.escape(tag)}\]\s*(?:-.*)?$', re.MULTILINE)
match = pattern.search(text)
if not match:
sys.stderr.write(f"No changelog section found for tag {tag}.\n")
sys.exit(1)
start = match.end()
rest = text[start:]
next_heading = re.search(r'^## \[', rest, re.MULTILINE)
section = rest[:next_heading.start()] if next_heading else rest
lines = [line.rstrip() for line in section.strip().splitlines()]
print('\n'.join(lines))
PY
)
if [[ -z "${NOTES}" ]]; then
echo "error: no content generated for tag ${TAG}" >&2
exit 1
fi
if [[ -n "${OUTPUT}" ]]; then
printf '%s\n' "${NOTES}" > "${OUTPUT}"
else
printf '%s\n' "${NOTES}"
fi