fix(ci): fetch 用 browser_download_url 下载(assets API 返回元数据非二进制)+ 大小校验
Design Source Checks / design-source (push) Has been cancelled

测试发现 Gitea /releases/{id}/assets/{id} 端点返回附件元数据 JSON(260B)而非二进制。
改用 browser_download_url 直链下载,并加 <1MB 拒绝发版的完整性校验。
端到端验证:winstage-v9.9.9 → 拉到完整 25M PE32 安装器;版本不匹配硬失败。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P9G7E3wmAYL9KeYCVZVsqu
This commit is contained in:
wangjia
2026-07-18 07:30:38 +08:00
parent 0a54ded445
commit fcd8733679
+12 -7
View File
@@ -32,17 +32,22 @@ MSG
exit 1
fi
# 找到同名资产 id 并下载(版本已由 STAGE_TAG 精确锁定)。JSON 经 stdin 传入避免转义问题
aid=$(printf '%s' "$info" | python3 -c "import sys,json; print(next((a['id'] for a in json.load(sys.stdin).get('assets',[]) if a['name']=='${NAME}'), ''))")
rid=$(printf '%s' "$info" | python3 -c "import sys,json; print(json.load(sys.stdin)['id'])")
# 同名资产的 browser_download_url(版本已由 STAGE_TAG 精确锁定)。JSON 经 stdin 传入避免转义。
# 注意:API 的 /assets/{id} 端点返回的是**元数据 JSON**(非二进制),必须用 browser_download_url。
dl=$(printf '%s' "$info" | python3 -c "import sys,json; print(next((a['browser_download_url'] for a in json.load(sys.stdin).get('assets',[]) if a['name']=='${NAME}'), ''))")
if [ -z "$aid" ]; then
if [ -z "$dl" ]; then
echo "ERROR: ${STAGE_TAG} 存在但缺少 ${NAME} 资产(GitHub 构建可能失败)。" >&2
exit 1
fi
echo "==> fetch-windows-staged: 下载 asset id=${aid} → dist/${NAME}"
curl -kfsS -H "Authorization: token ${FORGEJO_TOKEN}" \
"${base}/releases/${rid}/assets/${aid}" -o "dist/${NAME}"
echo "==> fetch-windows-staged: 下载 ${dl} → dist/${NAME}"
curl -kfsSL -H "Authorization: token ${FORGEJO_TOKEN}" "$dl" -o "dist/${NAME}"
ls -lh "dist/${NAME}"
# 完整性校验:安装器至少应有 1MB,防重定向页/截断被当成有效包发出去。
sz=$(wc -c < "dist/${NAME}")
if [ "$sz" -lt 1000000 ]; then
echo "ERROR: 下载的 ${NAME}${sz} 字节,疑似重定向页/损坏,拒绝发版。" >&2
exit 1
fi
echo "==> fetch-windows-staged: done(版本 ${VER} 匹配)"