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"。
4.2 KiB
发布物料(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。
手工发版(不想用脚本时)
-
复制
发布说明模板.md的内容到 Release 描述,按本次改动填「本次更新」 -
核对下载链接:模板里的下载表格已填当前百度网盘地址与提取码,换盘或重新分享时同步替换
-
若换了链接,同步改
网盘下载.url,让URL=与表格里的链接完全一致:[InternetShortcut] URL=https://pan.baidu.com/s/1j31dVPF_nPKSN2QYHU-Ygg?pwd=s33r IconIndex=0提取码已经拼进
?pwd=,双击打开后直接进目录,玩家不用再手输。 -
附件区上传
网盘下载.url(注意:不是把整个网盘文件传上来) -
检查版本号与更新日志:
launcher/server.py的CURRENT_VERSION、发布包根目录的更新日志.txt -
确认 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 指纹绑定),缺一个客户端就连不上