- 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>
82 lines
2.5 KiB
Bash
Executable file
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
|