From a458f77c35b99ffcd81d4612c482c9f2ff3ce9fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=99=B4=E5=A4=A9?= Date: Sat, 6 Jun 2026 19:14:20 +0800 Subject: [PATCH] fix(release): use changelog for release notes --- .github/workflows/release.yml | 76 +++++++++++++++++++++++------------ CHANGELOG.md | 2 - 2 files changed, 50 insertions(+), 28 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f318662..394a5c9 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -267,35 +267,59 @@ jobs: CHANGELOG_HEADER="主要变更" fi - # 按 conventional commit 前缀分类 - get_logs() { - local prefix="$1" - if [ -n "$RANGE" ]; then - git log "$RANGE" --pretty=format:"%s" --no-merges | { grep -iE "^${prefix}" || true; } | sed "s/^${prefix}[:(] */- /" | head -20 - else - git log --pretty=format:"%s" --no-merges -30 | { grep -iE "^${prefix}" || true; } | sed "s/^${prefix}[:(] */- /" | head -20 - fi - } + # 优先使用人工整理的 CHANGELOG.md 当前版本段,避免 Release Notes 只显示 release commit。 + CHANGELOG_BODY=$(python3 - "$VERSION" <<'PY' + import pathlib + import re + import sys - FEATS=$(get_logs "feat") - FIXES=$(get_logs "fix") - OTHERS=$( - if [ -n "$RANGE" ]; then - git log "$RANGE" --pretty=format:"%s" --no-merges | { grep -ivE "^(feat|fix|style|chore|ci|docs|test|build)" || true; } | sed 's/^/- /' | head -10 - else - git log --pretty=format:"%s" --no-merges -30 | { grep -ivE "^(feat|fix|style|chore|ci|docs|test|build)" || true; } | sed 's/^/- /' | head -10 - fi + version = sys.argv[1] + path = pathlib.Path("CHANGELOG.md") + if not path.exists(): + sys.exit(0) + + text = path.read_text(encoding="utf-8") + current = re.search(rf"^## \[{re.escape(version)}\](?:\s+-\s+.+)?\s*$", text, re.MULTILINE) + if not current: + sys.exit(0) + + rest = text[current.end():] + next_version = re.search(r"^## \[", rest, re.MULTILINE) + section = rest[:next_version.start()] if next_version else rest + print(section.strip()) + PY ) - CHANGELOG_BODY="" - if [ -n "$FEATS" ]; then - CHANGELOG_BODY="${CHANGELOG_BODY}"$'\n### ✨ 新功能\n'"${FEATS}"$'\n' - fi - if [ -n "$FIXES" ]; then - CHANGELOG_BODY="${CHANGELOG_BODY}"$'\n### 🐛 修复\n'"${FIXES}"$'\n' - fi - if [ -n "$OTHERS" ]; then - CHANGELOG_BODY="${CHANGELOG_BODY}"$'\n### 📦 其他\n'"${OTHERS}"$'\n' + if [ -z "$CHANGELOG_BODY" ]; then + # CHANGELOG.md 缺失时,退回 conventional commit 前缀分类。 + get_logs() { + local prefix="$1" + if [ -n "$RANGE" ]; then + git log "$RANGE" --pretty=format:"%s" --no-merges | { grep -iE "^${prefix}" || true; } | sed "s/^${prefix}[:(] */- /" | head -20 + else + git log --pretty=format:"%s" --no-merges -30 | { grep -iE "^${prefix}" || true; } | sed "s/^${prefix}[:(] */- /" | head -20 + fi + } + + FEATS=$(get_logs "feat") + FIXES=$(get_logs "fix") + OTHERS=$( + if [ -n "$RANGE" ]; then + git log "$RANGE" --pretty=format:"%s" --no-merges | { grep -ivE "^(feat|fix|style|chore|ci|docs|test|build)" || true; } | sed 's/^/- /' | head -10 + else + git log --pretty=format:"%s" --no-merges -30 | { grep -ivE "^(feat|fix|style|chore|ci|docs|test|build)" || true; } | sed 's/^/- /' | head -10 + fi + ) + + if [ -n "$FEATS" ]; then + CHANGELOG_BODY="${CHANGELOG_BODY}"$'\n### ✨ 新功能\n'"${FEATS}"$'\n' + fi + if [ -n "$FIXES" ]; then + CHANGELOG_BODY="${CHANGELOG_BODY}"$'\n### 🐛 修复\n'"${FIXES}"$'\n' + fi + if [ -n "$OTHERS" ]; then + CHANGELOG_BODY="${CHANGELOG_BODY}"$'\n### 📦 其他\n'"${OTHERS}"$'\n' + fi fi if [ -z "$CHANGELOG_BODY" ]; then CHANGELOG_BODY=$'\n- 常规更新与优化\n' diff --git a/CHANGELOG.md b/CHANGELOG.md index d905af0..9d166b5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,8 +5,6 @@ 格式遵循 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/), 版本号遵循 [语义化版本](https://semver.org/lang/zh-CN/)。 -## [未发布] - ## [0.18.0] - 2026-06-06 ### 新功能 (Features)