fix(release): use changelog for release notes

This commit is contained in:
晴天
2026-06-06 19:14:20 +08:00
parent c9825b1ebe
commit a458f77c35
2 changed files with 50 additions and 28 deletions

View File

@@ -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'