update at 2025-10-15 15:41:17

This commit is contained in:
douboer
2025-10-15 15:41:17 +08:00
parent 4671f3f6ee
commit 7329a2f3da
3 changed files with 249 additions and 2 deletions

181
RELEASE_SCRIPT_UPDATE.md Normal file
View File

@@ -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 内容会正确显示,支持删除重建,版本信息提取更准确。

View File

@@ -175,13 +175,15 @@ fi
# 7.2 使用 jq 生成正确的 JSON # 7.2 使用 jq 生成正确的 JSON
# 首先尝试使用原始内容(中文) # 首先尝试使用原始内容(中文)
JSON_PAYLOAD=$(echo "$TAG_MESSAGE" | jq -R -s -c \ # 使用 --arg 参数来正确处理多行文本,避免 \n 转义问题
JSON_PAYLOAD=$(jq -n -c \
--arg version "$VERSION" \ --arg version "$VERSION" \
--arg title "$VERSION - $RELEASE_TITLE" \ --arg title "$VERSION - $RELEASE_TITLE" \
--arg body "$TAG_MESSAGE" \
'{ '{
tag_name: $version, tag_name: $version,
name: $title, name: $title,
body: ., body: $body,
draft: false, draft: false,
prerelease: false prerelease: false
}') }')

64
test-json-generation.sh Executable file
View File

@@ -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 '.'