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