docs:新增远程发版脚本,Release 可用一条命令发布

Gitea 的 Release 全流程走 REST API(实测可行),不用点网页:

- docs/release/publish_release.py(纯标准库,无依赖):校验 tag → 建/更新
  Release → 上传附件 → 回读自检;支持 --dry-run / --draft / --prerelease /
  --expect-commit / --no-asset / --insecure
- 默认先比对本地 tag 与远端 tag 指向的提交,不一致直接拒绝 —— 2026.11.05
  就是 tag 落后 12 个提交,源码包是旧代码且外表看不出来
- .url 里仍是 REPLACE_WITH_YOUR_LINK 时拒绝发版(--force 可跳过)
- 附件同名先删再传,脚本可重复执行(幂等)
- docs/release/README.md 改为「一条命令发版 + 手工兜底」两套流程,附实测记录
- 根 README 发布流程、AGENTS.md 发版清单挂上脚本用法

实测:临时 tag 走完整流程 创建 201 → 上传 201 → 下载 200(内容正确)→
重复执行后只有一个同名附件 → 删除干净(release 204 / tag 已清)。
注意 Gitea 附件字段名必须是 attachment,用 file 会 500 "http: no such file"。
This commit is contained in:
hanfuit committed 2026-11-05 19:44:14 +08:00
1 parent 0897761c47
commit b88e1a223b
4 files changed
+360 -2

No files matched your search

+47 -2
View File
@@ -1,13 +1,56 @@
# 发布物料(docs/release)
每次发版要贴到仓库 Release 里的两样东西。体积十几个 G 的整包不适合直传,所以走「说明文档 + 网盘快捷方式」的组合。
每次发版要贴到仓库 Release 里的几样东西。体积十几个 G 的整包不适合直传,所以走「说明文档 + 网盘快捷方式」的组合。
| 文件 | 用途 |
|------|------|
| `publish_release.py` | **远程发版脚本**:校验 tag → 建/更新 Release → 上传附件(见下) |
| `发布说明模板.md` | Release 正文模板:本次更新、下载表格、安装步骤、说明 |
| `网盘下载.url` | Windows 网络快捷方式,双击直接打开网盘页面;作为附件上传 |
## 发版步骤
## 一条命令发版(推荐)
Gitea 的 Release 全流程都能走 REST API,不用点网页。脚本只用 Python 标准库,不需要装任何依赖。
```bash
# 1) token 放环境变量(只对当前窗口有效,别写进 .bat 提交上去)
set GITEA_TOKEN=xxxxxxxxxxxxxxxx
# 2) 先干跑:只打印计划,不产生任何写操作
python docs/release/publish_release.py --version v2026.11.06 --dry-run
# 3) 正式发(说明正文从模板读)
python docs/release/publish_release.py --version v2026.11.06 --notes-file docs/release/发布说明模板.md
```
它按六步走,任何一步不对就停下,不会留下半个 Release:
| 步骤 | 做什么 | 失败是否中止 |
|---|---|---|
| 1 | 解析本地 tag,与远端 tag 双向比对指向的提交 | **是** |
| 2 | 读说明正文(`--notes-file` 优先,其次 `--notes`) | — |
| 3 | 该 tag 已有 Release 就更新,没有就创建 | **是** |
| 4 | 检查附件;`.url` 里若还是 `REPLACE_WITH_YOUR_LINK` 就拒绝 | **是** |
| 5 | 上传附件;同名先删再传,**可以反复执行** | **是** |
| 6 | 回读自检(附件清单、是否草稿),打印 `html_url` | — |
常用参数:
```bash
--draft # 先存草稿(网页上只有自己可见),确认后去掉 --draft 重跑即转正式
--prerelease # 标记预发布
--expect-commit 3b240ec # 强制要求 tag 指向该提交,比默认更严
--asset 某个文件 # 可重复;默认只传 docs/release/网盘下载.url
--no-asset # 只发说明,不传附件
--insecure # 自签证书的内网 Gitea 才需要
--api / --repo # 换服务器或换仓库时用
```
**为什么第 1 步要卡 tag**:2026.11.05 发版时,Release 挂着的 tag 指向一个**落后 12 个提交**的旧提交,源码包于是是旧代码,从网页上完全看不出来。脚本现在把这件事挡在发版之前,`--expect-commit` 还能多加一道。
> 实测记录(2026-11-05):临时 tag 跑完整流程,创建 `201` → 上传 `201` → 下载 `200`(拿到正确的 `.url` 内容)→ 重复执行只保留一个同名附件 → 删除干净。字段名必须是 `attachment`,用 `file` 会返回 `500 http: no such file`。
## 手工发版(不想用脚本时)
1. 复制 `发布说明模板.md` 的内容到 Release 描述,按本次改动填「本次更新」
2. 核对下载链接:模板里的下载表格已填当前百度网盘地址与提取码,换盘或重新分享时同步替换
@@ -23,9 +66,11 @@
4. 附件区上传 `网盘下载.url`(注意:不是把整个网盘文件传上来)
5. 检查版本号与更新日志:`launcher/server.py` 的 `CURRENT_VERSION`、发布包根目录的 `更新日志.txt`
6. **确认 tag 指向**:`git log --oneline -1 v2026.11.xx` 与 `git ls-remote --tags origin` 里的 `^{}` 是同一个 sha
## 注意
- 仓库里的 `网盘下载.url` 现在指向**真实分享**(百度网盘,提取码 `s33r`);重新分享会生成新链接,记得同步改 `.url` 与模板表格,避免玩家点开 404
- 传完自己双击验证一次,确认能打开网盘页面而不是 404
- token 只走环境变量 `GITEA_TOKEN` 或 `--token`,**不要**提交到仓库里的任何文件
- 发布包里 `Client\90CN.dll` 与 `Server\runtime\bin\DNF90Server.exe` 必须配套(DLL 指纹绑定),缺一个客户端就连不上