# release.sh 脚本更新说明 ## 更新日期: 2025-10-15 ## 📋 本次更新内容 ### 1. ✅ 修复 Release 内容显示问题 **问题**: Release 内容中出现大量 `\n` 转义字符,导致格式混乱 **原因**: 使用 `jq -R -s` 读取文本时,会将整个文本作为一个 JSON 字符串,导致换行符被转义 **修复**: 改用 `jq --arg` 参数传递多行文本 ```bash # 修复前 (❌ 错误) JSON_PAYLOAD=$(echo "$TAG_MESSAGE" | jq -R -s -c \ --arg version "$VERSION" \ --arg title "$VERSION - $RELEASE_TITLE" \ '{ tag_name: $version, name: $title, body: ., draft: false, prerelease: false }') # 修复后 (✅ 正确) JSON_PAYLOAD=$(jq -n -c \ --arg version "$VERSION" \ --arg title "$VERSION - $RELEASE_TITLE" \ --arg body "$TAG_MESSAGE" \ '{ tag_name: $version, name: $title, body: $body, draft: false, prerelease: false }') ``` ### 2. ✅ 添加远程 Release 删除逻辑 **功能**: 如果远程已存在该版本的 Release,自动删除后重新创建 **实现步骤**: 1. 检查远程是否存在该版本的 Release 2. 如果存在,获取 Release ID 并删除 3. 创建新的 Release ```bash # 检查远程 Release check_response=$(curl -s -w "\n%{http_code}" \ -X GET "$GITEA_URL/api/v1/repos/$GITEA_REPO/releases/tags/$VERSION" \ -H "Authorization: token $GITEA_TOKEN") if [ "$check_http_code" -eq 200 ]; then # 删除已存在的 Release release_id=$(echo "$check_body" | jq -r '.id') curl -s -X DELETE \ "$GITEA_URL/api/v1/repos/$GITEA_REPO/releases/$release_id" \ -H "Authorization: token $GITEA_TOKEN" fi ``` ### 3. ✅ 优化版本信息提取 **改进**: 正确提取 release.md 中的版本块内容 **提取逻辑**: - 版本号: 取最后一个 `## vX.X.X` 格式的标题 - 标题: 取第一个 `###` 标题(去掉 emoji 和 markdown 标记) - 内容: 从版本标题下一行到下一个版本或文件结尾 ```bash # 提取版本号 VERSION=$(grep "^## v" release.md | tail -n 1 | sed 's/^## *//') # 提取内容 TAG_MESSAGE=$(awk " /^## $VERSION\$/ { flag=1; next } /^## v[0-9]/ && flag { exit } flag { print } " release.md) # 提取标题 RELEASE_TITLE=$(echo "$TAG_MESSAGE" | grep -m 1 "^###" | sed 's/^### *//' | sed 's/^[🎯✨🔧🐛📦]* *//') ``` ## 🎯 效果对比 ### 修复前 ``` Release Notes\n\nThis is release v1.0.3: 重大功能:停止生成 & UI 优化\n\nFor detailed... ``` 显示为一行,所有换行符都是 `\n` ### 修复后 ``` 发布时间: 2025-10-15 ### 🎯 重大功能:停止生成 & UI 优化 本版本实现了完整的停止生成功能... ``` 正确显示多行格式,保留原始排版 ## 🚀 使用方法 ```bash # 1. 设置 GITEA_TOKEN 环境变量 export GITEA_TOKEN="your_token_here" # 2. 确保 release.md 已更新 # 版本格式: ## v1.0.x # 标题格式: ### 🎯 标题内容 # 3. 运行发布脚本 ./release.sh # 输出示例: # ✅ 分支: main # ✅ 工作区干净 # 📝 版本号: v1.0.3 # 📌 标题: 重大功能:停止生成 & UI 优化 # 🔍 检查远程 Release 是否已存在... # ⚠️ 远程已存在 Release v1.0.3,正在删除... # ✅ 已删除旧的 Release # ✅ Release 创建成功: v1.0.3 # 🔗 Release 地址: https://... ``` ## 📝 release.md 格式要求 ```markdown ## v1.0.x 发布时间: YYYY-MM-DD ### 🎯 标题内容 详细说明... #### 子标题 更多内容... --- ## v1.0.y ... ``` ## ⚠️ 注意事项 1. **版本号格式**: 必须是 `## v` 开头,如 `## v1.0.3` 2. **标题提取**: 优先提取第一个 `###` 标题 3. **内容范围**: 从版本标题下一行到下一个版本或文件结尾 4. **字符集**: 如果中文内容创建失败,会自动回退到英文版本 5. **删除逻辑**: 会自动删除远程已存在的同名 Release ## 🔧 依赖要求 - `jq` - JSON 处理工具 - `curl` - HTTP 请求工具 - `git` - 版本控制 - `GITEA_TOKEN` - Gitea API 访问令牌 ## 📚 相关文件 - `release.sh` - 发布脚本 - `test-release-extract.sh` - 版本提取测试 - `test-json-generation.sh` - JSON 生成测试 - `release.md` - 版本发布记录 --- **更新完成!** 🎉 现在 Release 内容会正确显示,支持删除重建,版本信息提取更准确。