mirror of
https://gitee.com/xmz7891/ykxmz.git
synced 2026-10-19 08:20:44 +00:00
发布脚本:提前检查 EzHub 令牌写权限
Gitea 令牌可以只给读权限。只读令牌能读仓库、能列发行版, 看起来一切正常,但一推代码就 403、一建发行版也 403。 加了 check_ezhub_scope():开头就用一个**无副作用**的探针确认权限 (对不存在的发行版发 DELETE —— 403 说明缺 write:repository, 404 说明权限过了只是资源不存在),缺权限就立刻停下并给出 明确的修复指引,不让它走到一半才炸。 文档里也写清了这个坑。
This commit is contained in:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user