功能说明
为 Daily Satori 项目发布新版本,完整执行以下步骤:
- 计算版本号 - 从
app/build.gradle.kts的versionName读取当前版本,递增 patch 版本,并跳过任何包含数字4的版本号 - 更新版本号 - 将
app/build.gradle.kts的versionName更新为计算后的新版本 - 收集变更 - 获取上一版本 tag 到当前 HEAD 的提交记录
- 生成日志 - 创建
docs/versions/changelog_${version}.md - 提交代码 - 执行
git add .和git commit - 打版本标签 - 执行
git tag v${version} - 同步 GitHub - 推送
main和版本 tag,触发 GitHub Actions 构建并发布 APK
发布只需要提交代码、打 tag、同步 GitHub main 和 tag。不在本地编译 release 版本;APK 由 GitHub Actions 构建并上传到 Release。
使用场景
当需要发布新版本时使用,例如:
- "帮我发布最新版本"
执行步骤
1. 计算版本号
current_version=$(grep "versionName" app/build.gradle.kts | sed -E 's/.*versionName = "([^"]+)".*/\1/' | tr -d ' ')
major=${current_version%%.*}
rest=${current_version#*.}
minor=${rest%%.*}
patch=${current_version##*.}
next_patch=$((patch + 1))
current_version="${major}.${minor}.${next_patch}"
while [[ "$current_version" == *4* ]]; do
next_patch=$((next_patch + 1))
current_version="${major}.${minor}.${next_patch}"
done
版本号硬性规则:发布版本号任意段都不能包含数字 4。如果常规递增结果包含 4,继续递增直到不包含 4。例如当前版本 5.0.3,发版时必须跳到 5.0.5。
2. 更新版本号
perl -0pi -e "s/versionName = \"[^\"]+\"/versionName = \"${current_version}\"/" app/build.gradle.kts
3. 获取上一版本 tag
previous_tag=$(git tag --sort=-v:refname | head -2 | tail -1)
4. 生成更新日志
根据提交记录整理,按以下格式分类:
- 新增 xx 功能
- 优化 xx 功能
- 修复 xx 问题
分类规则:
- 新增 - 新功能、新特性
- 优化 - 性能改进、代码重构、用户体验提升
- 修复 - Bug 修复、问题解决
保存到 docs/versions/changelog_${version}.md
5. 执行 Git 命令
# 提交所有变更
git add .
git commit -m "Release v${current_version}"
# 打标签
git tag v${current_version}
6. 同步 GitHub
推送 main 和版本 tag。远程 tag 会触发 .github/workflows/android-release.yml,由 GitHub Actions 构建签名 APK 并上传到 GitHub Release。
git push origin main "v${current_version}"
# 使用 gh 验证 GitHub release/tag 已存在;如 Actions 仍在运行,可稍后重试
gh release view "v${current_version}" --repo SatoriTours/Daily --json tagName,targetCommitish,url
如果远程 release/tag 已存在,先验证它:
gh release view "v${current_version}" --repo SatoriTours/Daily --json tagName,targetCommitish,url
只有在用户明确要求修正错误 tag 时,才删除并重建远程 tag。不要 force push main/master。
注意事项
- 更新日志使用中文,聚焦功能变化
- 按新增/优化/修复分类,不包含测试改进
- 打标签前确认版本号正确,且版本号任意段都不包含数字
4 - tag 必须匹配
app/build.gradle.kts的versionName - tag 指向的 commit 必须属于
main分支历史 - 不使用
gh api手工操作 Git refs - 使用
git push origin main "v${current_version}"触发远程发布流程 - 不在本地编译 release,不在本地上传 APK