GFramework/ai-plan/public/semantic-release-versioning/todos/semantic-release-versioning-tracking.md
gewuyou b194238385 build(release): 迁移语义化版本打标流程
- 新增 semantic-release 配置并固定 release rules 与 v 前缀 tag 格式

- 重构 auto-tag workflow 为 main 上的真实打标与 workflow_dispatch dry-run 双入口

- 保留现有 publish workflow 并补充 ai-plan 跟踪与验证记录
2026-04-26 09:42:18 +08:00

3.9 KiB
Raw Blame History

Semantic Release 版本迁移跟踪

目标

将版本管理从固定 patch + 1 的自动打 tag 迁移到 semantic-release,同时保留现有 .github/workflows/publish.yml 的 tag 触发打包、NuGet 发布、GitHub Packages 发布和 GitHub Release 流程。

  • cycjimmy/semantic-release-action 替换 auto-tag.yml 的版本判断和打 tag 逻辑
  • 保留 publish.yml 的现有发布实现,不重写 NuGet 流程
  • 避免 semantic-releasepublish.yml 重复创建 GitHub Release
  • 将版本规则固定为 feat -> minorfix/perf/refactor -> patchBREAKING CHANGE! -> major
  • 为手动 workflow_dispatch 保留 dry-run 验证入口,先验证最近提交会算出什么版本

当前恢复点

  • 恢复点编号:SEMREL-RP-001
  • 当前阶段:Phase 1
  • 当前焦点:
    • 增加 .releaserc.json,仅启用版本分析与 release notes 生成,不启用 GitHub Release 发布插件
    • auto-tag.yml 改成 workflow_run 真正打 tag、workflow_dispatch 只做 dry-run 的双入口
    • 明确 PAT_TOKENGITHUB_TOKEN 的职责边界,确保 tag 继续触发 publish.yml

已知风险

  • GITHUB_TOKEN 推送 tag 不会再触发另一个 workflow真实发布仍需要 PAT_TOKEN
  • semantic-release 的版本判断完全依赖 Conventional Commits不规范提交会直接影响版本计算
  • 当前仓库本地 dotnet clean/build 仍受 WSL fallback NuGet 路径影响,验证时需要继续采用已知可用的直接构建命令

已完成

  • 已确认当前版本入口为 .github/workflows/auto-tag.yml,现状始终执行 PATCH + 1
  • 已确认当前 .github/workflows/publish.yml 由 tag 触发,并负责 .nupkg 打包、发布和 GitHub Release
  • 已确认最新 tag 为 v0.0.222
  • 已确认 v0.0.222..HEAD 之间存在 feat(...) 提交,按目标规则首次 dry-run 预期版本应为 v0.1.0
  • 已新增 .releaserc.json,仅保留 @semantic-release/commit-analyzer@semantic-release/release-notes-generator,避免 semantic-release 直接创建 GitHub Release
  • 已将 .github/workflows/auto-tag.yml 重写为:
    • workflow_runmain 上、CI 成功且提交消息包含 [release ci] 时执行真实打 tag
    • workflow_dispatch 只执行 dry-run输出 last_tagnext_versionnext_tag
  • 已明确真实打 tag 仍使用 PAT_TOKEN,因为 GITHUB_TOKEN 推送的 tag 不会继续触发 publish.yml

验证

  • git describe --tags --abbrev=0
    • 结果:通过
    • 备注:当前最新 tag 为 v0.0.222
  • git log --pretty=format:%h%x09%s v0.0.222..HEAD
    • 结果:通过
    • 备注:最近版本窗口内存在多条 feat(...),后续 dry-run 预期应提升 minor
  • dotnet build GFramework.Core.Abstractions/GFramework.Core.Abstractions.csproj -c Release -p:RestoreFallbackFolders=
    • 结果:通过
    • 备注:GFramework.Core.AbstractionsGFramework.Cqrs.Abstractions Release 构建通过,0 warning / 0 error
  • npx --yes semantic-release --dry-run --no-ci
    • 结果:受阻
    • 备注:当前工作树的本地 tag 历史在 git fetch --tags 阶段出现 would clobber existing tag 冲突,不能直接作为 dry-run 环境
  • git clone --branch main --single-branch git@github.com:GeWuYou/GFramework.git /tmp/gframework-semrel-dryrun
    • 结果:通过
    • 备注:已建立干净临时克隆用于 dry-run 验证
  • npx --yes semantic-release --dry-run --no-ci(在 /tmp/gframework-semrel-dryrun
    • 结果:通过
    • 备注dry-run 成功识别 v0.0.222 为最新 release并分析 269 个提交;按当前规则会提升到下一次 minor 发布,预期 tag 为 v0.1.0

下一步

  1. 复核 workflow_dispatch dry-run 输出格式是否还需要额外收窄或增加说明
  2. 评估是否要把 workflow_run[release ci] 门闸改成更显式的 PR label 或 manual approval
  3. 若本轮验证通过,按仓库要求创建提交并等待你审阅发版流程细节