发布流程
本文档描述了 Rin 项目的发布流程。
概述
Rin 使用语义化版本控制,并遵循结构化的发布工作流以确保稳定性和一致性。
主要特性:
- 🤖 自动生成发布说明:从常规提交信息生成
- 📝 详细的变更日志:在
CHANGELOG.md中维护,包含迁移指南 - ✅ 自动验证:CI 检查版本一致性并运行测试
- 🚀 自动部署:在版本标签上部署到 Cloudflare
版本格式
版本遵循 MAJOR.MINOR.PATCH 格式:
- MAJOR:不兼容的 API 变更
- MINOR:新功能(向后兼容)
- PATCH:Bug 修复(向后兼容)
预发布版本可以用连字符标记,例如 v1.0.0-beta.1。
提交信息规范
我们遵循 Conventional Commits 规范。这使我们能够自动生成发布说明。
快速参考
更多详情,请参考提交规范。
发布工作流
1. 确保所有变更已就绪
- 所有功能/修复已合并到
main - 所有提交遵循常规提交格式
- 测试通过(
bun run typecheck、bun run build)
2. 运行发布脚本
脚本将:
- ✅ 运行发布前检查(typecheck、build、版本一致性)
- 📝 更新所有
package.json文件中的版本 - 📝 生成包含提交列表的 CHANGELOG.md 模板
- 🏷️ 创建 git 提交和标签
重要:脚本会生成一个 CHANGELOG 模板。您应该在推送前审查和编辑它!
3. 审查和编辑 CHANGELOG
运行发布脚本后:
4. 试运行(可选)
要在不应用更改的情况下预览:
5. 推送发布
6. 自动发布流程
一旦标签被推送,GitHub Actions 会自动:
-
🔍 验证(
release.yml)- 验证版本一致性
- 运行 typecheck 和 build
-
📝 发布说明生成(
release.yml)- 按类型分类提交(功能、修复等)
- 从 CHANGELOG.md 提取详细说明
- 创建格式化的 GitHub Release
-
🚀 部署(
deploy.yml)- 验证部署版本
- 部署到 Cloudflare Workers
- 运行数据库迁移
发布说明结构
GitHub Releases 将包含:
对于 Fork 用户
选项 1:同步 Fork(推荐)
- 转到您在 GitHub 上的 fork 仓库
- 点击 "Sync fork" 按钮
- 查看 CHANGELOG.md 了解迁移步骤
- 如果需要,更新环境变量
- 如果已配置,部署将自动运行
选项 2:手动更新
发布检查清单
在创建发布之前:
- 所有测试通过(
bun run typecheck、bun run build) - 所有提交遵循常规格式
- CHANGELOG.md 模板已生成并编辑
- 包含迁移指南(用于破坏性变更)
- 文档已更新(如果需要)
推送标签后:
- GitHub Release 成功创建
- 发布说明看起来正确
- 部署成功完成
紧急发布
对于需要立即发布的严重 Bug:
故障排除
版本不匹配错误
问题:CI 显示"版本不匹配"错误
解决方案:
- 确保 git 标签与
package.json版本匹配 - 发布脚本会自动处理
- 对于手动发布,确保:
git tag v1.0.0与 package.json 中的"version": "1.0.0"匹配
空的发布说明
问题:GitHub Release 没有列出变更
解决方案:
- 确保提交遵循常规格式(
feat:、fix:等) - 检查标签之间是否存在提交:
git log v0.1.0..v0.2.0 --oneline - 非常规提交不会出现在分类列表中
部署失败
问题:发布后部署失败
解决方案:
- 检查 GitHub Actions 日志以获取特定错误
- 验证所有必需的 secrets 已配置
- 检查 Cloudflare 仪表板以获取部署错误
- 如果需要,从 Actions 选项卡手动触发部署
CHANGELOG.md 冲突
问题:CHANGELOG.md 中的合并冲突
解决方案:
- 保留两个部分
- 按时间顺序重新排列(最新的在前)
- 删除重复条目
最佳实践
编写好的提交
✅ 好的:
❌ 不好的:
维护 CHANGELOG
- 在开发期间保持 [Unreleased] 部分更新
- 为破坏性变更编写迁移指南
- 在迁移部分包含代码示例
- 适当时致谢贡献者
版本升级
- Patch (0.0.1):仅 Bug 修复
- Minor (0.1.0):新功能,向后兼容
- Major (1.0.0):破坏性变更
不确定时,对新功能使用 minor。
有问题?
- 📖 阅读提交规范了解提交指南
- 🐛 报告问题:GitHub Issues
- 💬 加入我们的社区讨论