play.wenpai.net/scripts/fetch-release.sh
elementary-qa 1212ecdaac 添加 Forgejo 拉取脚本、趋势追踪、验收基线配置
- fetch-release.sh: 从 Forgejo API 直接拉取插件 release zip
- trend-tracker.js: SQLite 存储验收结果,支持趋势查询和版本对比
- acceptance-criteria.json: 量化验收门槛(Lighthouse/安全/i18n/视觉回归)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-19 17:05:50 +08:00

82 lines
2.5 KiB
Bash
Executable file

#!/usr/bin/env bash
# Forgejo release 拉取脚本
# 用法:
# ./scripts/fetch-release.sh <owner/repo> [version]
# ./scripts/fetch-release.sh feibisi/wpmind # 拉最新 release
# ./scripts/fetch-release.sh feibisi/wpmind v0.11.3 # 拉指定版本
#
# 下载到: ~/下载/<repo>-<version>.zip
set -euo pipefail
REPO="${1:?用法: fetch-release.sh <owner/repo> [version]}"
VERSION="${2:-}"
DOWNLOAD_DIR="${HOME}/下载"
API_BASE="https://feicode.com/api/v1"
# 从 bashrc 加载 token
source "${HOME}/.bashrc" 2>/dev/null || true
TOKEN="${FORGEJO_TOKEN:?FORGEJO_TOKEN 未设置}"
REPO_NAME=$(basename "$REPO")
# 重试函数(指数退避)
api_call() {
local url="$1" attempt=0 max=3 delay=2
while [ $attempt -lt $max ]; do
local resp
resp=$(curl -sf -H "Authorization: token ${TOKEN}" "$url" 2>/dev/null) && {
echo "$resp"; return 0
}
attempt=$((attempt + 1))
[ $attempt -lt $max ] && sleep $delay && delay=$((delay * 2))
done
echo "API 调用失败: $url" >&2; return 1
}
if [ -n "$VERSION" ]; then
echo "获取 ${REPO} ${VERSION} ..."
RELEASE_JSON=$(api_call "${API_BASE}/repos/${REPO}/releases/tags/${VERSION}")
else
echo "获取 ${REPO} 最新 release ..."
RELEASE_JSON=$(api_call "${API_BASE}/repos/${REPO}/releases?limit=1")
RELEASE_JSON=$(echo "$RELEASE_JSON" | python3 -c "import sys,json; print(json.dumps(json.load(sys.stdin)[0]))")
fi
TAG=$(echo "$RELEASE_JSON" | python3 -c "import sys,json; print(json.load(sys.stdin).get('tag_name','unknown'))")
echo "版本: $TAG"
# 查找 zip 附件
ASSET_URL=$(echo "$RELEASE_JSON" | python3 -c "
import sys, json
r = json.load(sys.stdin)
for a in r.get('assets', []):
if a['name'].endswith('.zip'):
print(a['browser_download_url'])
break
else:
print('')
")
if [ -z "$ASSET_URL" ]; then
# 没有 zip 附件,用 tarball
ASSET_URL="${API_BASE}/repos/${REPO}/archive/${TAG}.zip"
echo "无 zip 附件,使用源码归档"
fi
OUTPUT="${DOWNLOAD_DIR}/${REPO_NAME}-${TAG}.zip"
echo "下载: ${ASSET_URL}"
curl -sL -H "Authorization: token ${TOKEN}" -o "$OUTPUT" "$ASSET_URL"
if [ -f "$OUTPUT" ] && [ -s "$OUTPUT" ]; then
SIZE=$(du -h "$OUTPUT" | cut -f1)
echo "完成: ${OUTPUT} (${SIZE})"
# 同时复制到 NAS staging 供其他脚本使用
STAGING_DIR="/mnt/shared-context/staging/elementary"
if [ -d "$STAGING_DIR" ]; then
cp "$OUTPUT" "${STAGING_DIR}/${REPO_NAME}.zip"
echo "已复制到 staging: ${STAGING_DIR}/${REPO_NAME}.zip"
fi
else
echo "下载失败" >&2; exit 1
fi