发版(Release)
发版不只是打 tag,是一个质量门禁流程:安全审查→生成版本→创建 Release。
用途
该技能用于自动化完整发版流程,覆盖版本号生成、changelog 生成、git tag、GitHub Release(或本地 changelog 文件)。与其他技能的关系为:task-finish(功能收尾)→ security-audit(发版前安全审查)→ 审查通过后执行 release(本 skill)。
第一步:发版前检查
发版前必须确认以下条件:
- 代码状态检查
- 工作区干净?(无未提交改动)
- 在正确的分支上?(main / release branch)
- 已合并所有需要的 PR?
- CI 状态检查(如果有)
- GitHub Actions 全绿?
- 安全审查
- 提示用户:是否需要跑 security-audit?(上线服务强烈建议)
- 测试验证
- 核心功能是否经过验证?
检查命令:
工作区状态
git status
CI 状态(GitHub)
gh run list --limit 5
未合并的 PR
gh pr list
任何检查不通过,提示用户处理后再继续,不强行发版。
第二步:确定版本号
CalVer 格式:YYYY.MM.PATCH
各部分的含义:
- YYYY:年份,示例 2026
- MM:月份(不补零),示例 4
- PATCH:当月第几次发布(从 1 开始),示例 1, 2, 3...
版本号生成逻辑:
获取当前年月
YEAR=$(date +%Y) MONTH=$(date +%-m)
查找当月已有的最大版本号
LATEST=$(git tag --list "${YEAR}.${MONTH}.*" --sort=-version:refname | head -1)
if [ -z "$LATEST" ]; then
当月第一次发布
VERSION="${YEAR}.${MONTH}.1" else
递增 PATCH
PATCH=$(echo "$LATEST" | awk -F. '{print $3 + 1}') VERSION="${YEAR}.${MONTH}.${PATCH}" fi
echo "版本号: $VERSION"
示例:
- 2026 年 4 月第 1 次发布 → 2026.4.1
- 2026 年 4 月第 2 次发布 → 2026.4.2
- 2026 年 5 月第 1 次发布 → 2026.5.1
第三步:生成 Changelog
从 git log 提取:
获取上一个 tag 到 HEAD 的所有提交
PREV_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "")
if [ -z "$PREV_TAG" ]; then
没有历史 tag,取所有提交
COMMITS=$(git log --oneline --pretty=format:"%s") else COMMITS=$(git log ${PREV_TAG}..HEAD --oneline --pretty=format:"%s") fi
按 type 分组:根据 commit message 的 type(scope): desc 格式自动分组,示例:
Changelog — v2026.4.1
新功能(Features)
- auth: 支持 OAuth2 第三方登录
- export: 用户数据导出功能
修复(Fixes)
- login: 修复密码错误时返回 500 的问题
- cache: 修复缓存 key 冲突
重构(Refactoring)
- api: 统一错误响应格式
其他
- docs: 更新 API 文档
- test: 补充登录模块测试用例
分组规则:
- feat → 新功能(Features)
- fix → 修复(Fixes)
- refactor → 重构(Refactoring)
- perf → 性能优化(Performance)
- docs, test, chore, ci → 其他(如果没有 feat/fix/refactor 可省略)
Changelog 输出:
- 有 GitHub:嵌入 GitHub Release 的 body
- 无 GitHub:写入 docs/changelog/YYYY-MM-DD-v<版本号>.md
第四步:创建 Release
方式 A:GitHub Release(优先)
创建 tag
git tag -a "v${VERSION}" -m "Release v${VERSION}" git push origin "v${VERSION}"
创建 GitHub Release
gh release create "v${VERSION}"
--title "v${VERSION}"
--notes "$(cat <<'EOF'
<changelog 内容>
EOF
)"
方式 B:本地 Changelog 文件
如果项目不在 GitHub 或不需要 GitHub Release:
创建 tag
git tag -a "v${VERSION}" -m "Release v${VERSION}"
写入 changelog 文件
存入 docs/changelog/YYYY-MM-DD-v<版本号>.md
第五步:发版后
- 通知用户:发版完成,输出版本号和 Release URL
- 更新 package.json / pyproject.toml(如果项目需要版本号同步到配置文件)
- 提醒:如果有需要手动操作的部署步骤,列出来
完整发版流程
用户:发个版 │ ├─ Step 1: 发版前检查(代码状态 + CI + 安全) ├─ Step 2: 生成版本号(CalVer) ├─ Step 3: 生成 Changelog(从 git log) ├─ Step 4: 创建 Release(GitHub 或本地文件) └─ Step 5: 发版后处理
适用场景
适合需要对 Git 仓库进行规范化发版、希望自动生成 CalVer 版本号与 changelog,并在 GitHub 上创建 Release(或仅生成本地 changelog 文件)的项目。
限制
发版前检查中若任何一项不通过,会提示用户处理后再继续,不强行发版。是否运行 security-audit 由用户确认。其他收费、价格、平台等具体信息暂未提供。