deploy: 站点探测不再强制 IPv4/IPv6 并加超时

git.jocayn.qzz.io 在 Cloudflare 后面同时有 IPv4/IPv6 地址,部分网络(如 nas)IPv4 不通、
IPv6 可用;原来用 -4 强制 IPv4 且没有连接超时,会重试到卡死。改为由 curl 自动选择协议族,
探测 8 秒连接超时、15 秒总时长且不重试,下载加 15 秒连接超时。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
jocay
2026-10-18 10:57:56 +08:00
parent 76f6fe32f5
commit a8d6dd4b87
4 changed files with 37 additions and 32 deletions
+17 -16
View File
@@ -66,42 +66,43 @@ case "$ARCH" in
esac
# ---------- 下载工具 ----------
# fetch <url> <输出文件> [-4|-6]
# fetch <url> <输出文件> [probe]:probe 用于探测站点,连接最多等 8 秒、总共 15 秒且不重试
fetch() {
if [ "${3:-}" = probe ]; then
c_opt="--connect-timeout 8 -m 15"; w_opt="-T 15 -t 1"
else
c_opt="--connect-timeout 15 --retry 3"; w_opt="-T 60 -t 3"
fi
if command -v curl >/dev/null 2>&1; then
if [ -n "${BOLT_DL_TOKEN:-}" ]; then
curl -fsSL --retry 3 ${3:-} -H "Authorization: token $BOLT_DL_TOKEN" -o "$2" "$1"
curl -fsSL $c_opt -H "Authorization: token $BOLT_DL_TOKEN" -o "$2" "$1"
else
curl -fsSL --retry 3 ${3:-} -o "$2" "$1"
curl -fsSL $c_opt -o "$2" "$1"
fi
elif command -v wget >/dev/null 2>&1; then
if [ -n "${BOLT_DL_TOKEN:-}" ]; then
wget -q ${3:-} --header="Authorization: token $BOLT_DL_TOKEN" -O "$2" "$1"
wget -q $w_opt --header="Authorization: token $BOLT_DL_TOKEN" -O "$2" "$1"
else
wget -q ${3:-} -O "$2" "$1"
wget -q $w_opt -O "$2" "$1"
fi
else
die "需要 curl 或 wget"
fi
}
# 探测可用站点:先 IPv4 站点,再 IPv6 站点
IPFLAG=""
# 探测可用站点:先 IPv4 站点再 IPv6 站点(不强制协议族,由 curl 自动选择可用的 IPv4 / IPv6 地址)
pick_host() {
if [ -n "${BOLT_GIT_HOST:-}" ]; then
HOST="${BOLT_GIT_HOST%/}"
return
fi
for cand in "$HOST4 -4" "$HOST6 -6"; do
h=${cand% *}
f=${cand#* }
if fetch "$h/api/v1/version" "$TMP/probe" "$f" 2>/dev/null; then
for h in "$HOST4" "$HOST6"; do
if fetch "$h/api/v1/version" "$TMP/probe" probe 2>/dev/null; then
HOST=$h
IPFLAG=$f
return
fi
done
die "无法连接 $HOST4(IPv4)或 $HOST6(IPv6),可用 BOLT_GIT_HOST 指定站点"
die "无法连接 $HOST4 或 $HOST6,可用 BOLT_GIT_HOST 指定站点"
}
# ver_cmp a b:输出 1 / 0 / -1
@@ -140,7 +141,7 @@ else
pick_host
say "下载站点: $HOST"
if [ -z "$VERSION" ]; then
fetch "$HOST/api/v1/repos/$REPO/releases/latest" "$TMP/latest.json" "$IPFLAG" || die "查询最新版本失败"
fetch "$HOST/api/v1/repos/$REPO/releases/latest" "$TMP/latest.json" || die "查询最新版本失败"
VERSION=$(sed -n 's/.*"tag_name":"\([^"]*\)".*/\1/p' "$TMP/latest.json")
[ -n "$VERSION" ] || die "无法解析最新版本号"
EXPLICIT=0
@@ -161,9 +162,9 @@ else
fi
BASE="$HOST/$REPO/releases/download/$VERSION"
say "下载: $BASE/bolt-$PLATFORM-$ARCH"
fetch "$BASE/bolt-$PLATFORM-$ARCH" "$NEW_BIN" "$IPFLAG" || die "下载失败,请确认 Release $VERSION 有 bolt-$PLATFORM-$ARCH 附件"
fetch "$BASE/bolt-$PLATFORM-$ARCH" "$NEW_BIN" || die "下载失败,请确认 Release $VERSION 有 bolt-$PLATFORM-$ARCH 附件"
# 有 SHA256SUMS 附件时校验
if fetch "$BASE/SHA256SUMS" "$TMP/SHA256SUMS" "$IPFLAG" 2>/dev/null; then
if fetch "$BASE/SHA256SUMS" "$TMP/SHA256SUMS" 2>/dev/null; then
want=$(awk -v f="bolt-$PLATFORM-$ARCH" '$2 == f || $2 == "*" f {print $1}' "$TMP/SHA256SUMS")
if command -v sha256sum >/dev/null 2>&1; then
got=$(sha256sum "$NEW_BIN" | awk '{print $1}')