Files
在7楼 c1266bcbbd docs: version-next.sh 头注登记 CI-skip 标记导致 alpha 断号的坑 (#1171)
* fix: changelog 回写改走 auto-merge PR 流,适配 main 的 ruleset 保护(#1159)

- ruleset 要求所有变更经 PR,GITHUB_TOKEN 直接推 main 必被 403,改为建分支 + PR + auto-merge
- GITHUB_TOKEN 建的 PR 不触发 CI(防递归规则),job 内手动 dispatch ci.yml/codeql 补跑 required checks
- ci.yml/codeql-analysis.yml 补 workflow_dispatch 触发器
- 弃用提交信息 CI-skip 标记:它会让 squash 合并到 main 的 push 整体跳过 alpha 构建(#1160 的合并已因此漏建);GITHUB_TOKEN 的提交天然不触发 workflow,无需标记
- AGENTS.md 登记提交信息禁忌

* docs: version-next.sh 头注登记 CI-skip 标记导致 alpha 断号的坑(#1159)

#1160 合并时提交信息正文含 skip 标记字面量,GitHub 整体跳过了那次 push 的
全部 workflow,alpha 构建静默缺失。此处是排查序号断号时最可能被读到的地方。
2026-09-27 17:52:32 +00:00

88 lines
3.0 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
# 新发布策略(ADR-0002)的算号入口:版本号由 git tag 历史推导,
# 任何文件都不是权威源,本地构建恒为 0.0.0-dev,CI 一律用本脚本显式注入。
#
# alpha -> <上个稳定tag的下一patch>-alpha.N,N=自该 tag 以来的提交数
# stable <level> -> 上个稳定 tag 按 patch|minor|major bump
# latest -> 最新稳定 tag(无则输出空)
#
# 测试 seam:VERSION_REPO_DIR 可指向任意 git 仓库(fixture 测试用),
# 缺省为本脚本所在仓库。CI 需要 fetch-depth: 0,否则看不到 tag。
#
# 注意:alpha 序号 = 自上个稳定 tag 以来的提交数,依赖每次合并都真实触发。
# 若提交信息/PR 标题里出现 CI-skip 标记([skip ci] 等字面量),GitHub 会整体
# 跳过那次 push 的全部 workflow —— alpha 构建静默缺失、序号断号,且不报任何错。
set -euo pipefail
repo_dir=${VERSION_REPO_DIR:-$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)}
die() {
echo "$1" >&2
exit 1
}
# 稳定 tag:纯数字三段式。v 前缀的历史异类和 -alpha.N 预发布都不算。
stable_tags() {
git -C "$repo_dir" tag -l | grep -E '^[0-9]+\.[0-9]+\.[0-9]+$' | sort -V || true
}
latest_stable() {
stable_tags | tail -1
}
# 无稳定 tag 的兜底(仓库首次发版场景):版本线从 0.1.0 起步,
# 此时 stable 无论选什么级别都是 0.1.0,alpha 基底也是 0.1.0。
default_base="0.1.0"
bump() { # <版本> <patch|minor|major>
awk -F. -v level="$2" '{
if (level == "major") printf "%d.0.0", $1 + 1
else if (level == "minor") printf "%d.%d.0", $1, $2 + 1
else printf "%d.%d.%d", $1, $2, $3 + 1
}' <<< "$1"
}
alpha() {
local latest base n
latest=$(latest_stable)
if [ -z "$latest" ]; then
base=$default_base
n=$(git -C "$repo_dir" rev-list --count HEAD)
else
base=$(bump "$latest" patch)
n=$(git -C "$repo_dir" rev-list --count "$latest..HEAD")
fi
# squash 合并保证 N 等于合并的 PR 数;发稳定版后计数自然复位。
[ "$n" -ge 1 ] || die "自 ${latest:-仓库起点} 以来没有新提交,没有可出的 alpha"
echo "$base-alpha.$n"
}
stable() {
local level=${1:-} latest
case "$level" in
patch | minor | major) ;;
*) die "未知升级级别: '${level}'(期望 patch|minor|major)" ;;
esac
latest=$(latest_stable)
if [ -z "$latest" ]; then
echo "$default_base"
else
bump "$latest" "$level"
fi
}
case "${1:-help}" in
alpha) alpha ;;
stable) stable "${2:-}" ;;
latest) latest_stable ;;
*)
cat <<EOF
用法:$0 {alpha|stable <patch|minor|major>|latest}
alpha 当前 HEAD 应产出的 alpha 版本(无新提交则报错)
stable 按级别算下一个稳定版本
latest 最新稳定 tag,无则输出空
环境变量 VERSION_REPO_DIR 可指定目标 git 仓库(测试用)。
EOF
;;
esac