diff --git a/RELEASE_SCRIPT_UPDATE.md b/RELEASE_SCRIPT_UPDATE.md new file mode 100644 index 0000000..b1e64bd --- /dev/null +++ b/RELEASE_SCRIPT_UPDATE.md @@ -0,0 +1,181 @@ +# 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 内容会正确显示,支持删除重建,版本信息提取更准确。 diff --git a/release.sh b/release.sh index 0509cfb..a4550a3 100755 --- a/release.sh +++ b/release.sh @@ -175,13 +175,15 @@ fi # 7.2 使用 jq 生成正确的 JSON # 首先尝试使用原始内容(中文) -JSON_PAYLOAD=$(echo "$TAG_MESSAGE" | jq -R -s -c \ +# 使用 --arg 参数来正确处理多行文本,避免 \n 转义问题 +JSON_PAYLOAD=$(jq -n -c \ --arg version "$VERSION" \ --arg title "$VERSION - $RELEASE_TITLE" \ + --arg body "$TAG_MESSAGE" \ '{ tag_name: $version, name: $title, - body: ., + body: $body, draft: false, prerelease: false }') diff --git a/test-json-generation.sh b/test-json-generation.sh new file mode 100755 index 0000000..f49d6ee --- /dev/null +++ b/test-json-generation.sh @@ -0,0 +1,64 @@ +#!/bin/bash + +# 测试 JSON 生成逻辑 + +echo "🧪 测试 Release JSON 生成" +echo "================================" + +# 模拟提取的内容 +VERSION="v1.0.3" +RELEASE_TITLE="重大功能:停止生成 & UI 优化" +TAG_MESSAGE="发布时间: 2025-10-15 + +### 🎯 重大功能:停止生成 & UI 优化 + +本版本实现了完整的停止生成功能。 + +#### ✨ 核心功能 + +**⏸️ 智能停止生成** +- 点击停止按钮立即中断 AI 回复 +- 保留已生成的内容" + +echo "📝 版本号: $VERSION" +echo "📌 标题: $RELEASE_TITLE" +echo "" + +# 方法1:使用 jq -R -s(会导致 \n 转义) +echo "❌ 方法1 (有问题的):" +JSON_BAD=$(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 + }') +echo "$JSON_BAD" | jq -r '.body' | head -n 5 +echo "" + +# 方法2:使用 --arg(正确的) +echo "✅ 方法2 (正确的):" +JSON_GOOD=$(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 + }') +echo "$JSON_GOOD" | jq -r '.body' | head -n 5 +echo "" + +echo "🔍 比较:" +echo "方法1 body 长度: $(echo "$JSON_BAD" | jq -r '.body' | wc -c)" +echo "方法2 body 长度: $(echo "$JSON_GOOD" | jq -r '.body' | wc -c)" +echo "" + +echo "📋 完整的 JSON (方法2):" +echo "$JSON_GOOD" | jq '.'