Files
90CNServer/docs/release
hanfuit b88e1a223b 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"。
2026-11-05 19:44:14 +08:00
..

发布物料(docs/release)

每次发版要贴到仓库 Release 里的几样东西。体积十几个 G 的整包不适合直传,所以走「说明文档 + 网盘快捷方式」的组合。

文件 用途
publish_release.py 远程发版脚本:校验 tag → 建/更新 Release → 上传附件(见下)
发布说明模板.md Release 正文模板:本次更新、下载表格、安装步骤、说明
网盘下载.url Windows 网络快捷方式,双击直接打开网盘页面;作为附件上传

一条命令发版(推荐)

Gitea 的 Release 全流程都能走 REST API,不用点网页。脚本只用 Python 标准库,不需要装任何依赖。

# 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 —

常用参数:

--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. 核对下载链接:模板里的下载表格已填当前百度网盘地址与提取码,换盘或重新分享时同步替换

  3. 若换了链接,同步改 网盘下载.url,让 URL= 与表格里的链接完全一致:

    [InternetShortcut]
    URL=https://pan.baidu.com/s/1j31dVPF_nPKSN2QYHU-Ygg?pwd=s33r
    IconIndex=0
    

    提取码已经拼进 ?pwd=,双击打开后直接进目录,玩家不用再手输。

  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 指纹绑定),缺一个客户端就连不上