发布脚本:提前检查 EzHub 令牌写权限

Gitea 令牌可以只给读权限。只读令牌能读仓库、能列发行版,
看起来一切正常,但一推代码就 403、一建发行版也 403。

加了 check_ezhub_scope():开头就用一个**无副作用**的探针确认权限
(对不存在的发行版发 DELETE —— 403 说明缺 write:repository,
404 说明权限过了只是资源不存在),缺权限就立刻停下并给出
明确的修复指引,不让它走到一半才炸。

文档里也写清了这个坑。
This commit is contained in:
xmz7891
2026-10-07 12:25:12 +08:00
parent 2d99c05865
commit d60dfcf671
3 changed files with 225 additions and 0 deletions
+42
View File
@@ -227,6 +227,43 @@ def gitea_release(token: str, version: str, body: str,
return ok == len(files)
def check_ezhub_scope(token: str) -> bool:
"""提前确认 EzHub 令牌有 write:repository。
为什么要单独查:
Gitea 的令牌可以只给读权限。只读令牌能读仓库、能列发行版,
看起来"正常",但一推代码就 403、一建发行版就 403,
而且报错信息藏在一层层输出里。所以开头就探一下。
探法(无副作用):删一个**不存在的**发行版。
403 -> 缺 write:repository
404 -> 有写权限(只是资源不存在)
"""
url = ("https://git.261826.xyz/api/v1/repos/xmz/ykxmz"
"/releases/99999999")
req = urllib.request.Request(
url, method="DELETE",
headers={"Authorization": "token " + token,
"User-Agent": "ykxmz-release"})
try:
urllib.request.urlopen(req, timeout=30)
return True
except urllib.error.HTTPError as exc:
if exc.code == 404:
return True
detail = exc.read().decode("utf-8", "replace")[:200]
if "write:repository" in detail:
print(" ✗ EzHub 令牌缺 write:repository 权限")
print(" -> 去 EzHub:设置 → 应用 → 生成令牌,"
"权限勾上 write:repository")
return False
print(" ✗ EzHub 令牌检查失败 HTTP %s: %s" % (exc.code, detail))
return False
except Exception as exc: # noqa: BLE001
print(" ✗ 连不上 EzHub: %s" % exc)
return False
def main() -> int:
args = [a for a in sys.argv[1:] if not a.startswith("--")]
dry = "--dry" in sys.argv
@@ -269,6 +306,11 @@ def main() -> int:
return 1
print(" ✓ 工作区干净")
# 两个平台的令牌都得有写权限,否则走到一半才失败
if not check_ezhub_scope(ezhub_token):
return 1
print(" ✓ EzHub 令牌有写权限")
# 对外材料清洁度:绝不能让管理页字眼进发行版说明
for word in ("zhongzhuanzhan", "/admin", "管理后台", "管理页"):
if word in body: