fix: 修复 Gitea Runner 下载 404(v3+ 改名 gitea-runner,改为 assets 匹配 + 多源回退)
This commit is contained in:
+113
-13
@@ -40,6 +40,7 @@
|
|||||||
# --name "my-runner-01" 自定义 Runner 名字(默认是 runner-主机名)
|
# --name "my-runner-01" 自定义 Runner 名字(默认是 runner-主机名)
|
||||||
# --user gitrunner 运行用户(默认 gitrunner)
|
# --user gitrunner 运行用户(默认 gitrunner)
|
||||||
# --dir /opt/act_runner 安装目录(默认 /opt/act_runner)
|
# --dir /opt/act_runner 安装目录(默认 /opt/act_runner)
|
||||||
|
# --version 3.3.2 【可选】固定安装某版本,不写默认用 Gitea 官方 latest
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
@@ -57,7 +58,7 @@ SCOPE="repo" # repo | org | global(默认 repo,绝大多数人的场景)
|
|||||||
RUNNER_NAME="runner-$(hostname | tr '[:upper:]' '[:lower:]')"
|
RUNNER_NAME="runner-$(hostname | tr '[:upper:]' '[:lower:]')"
|
||||||
RUNNER_USER="gitrunner"
|
RUNNER_USER="gitrunner"
|
||||||
INSTALL_DIR="/opt/act_runner"
|
INSTALL_DIR="/opt/act_runner"
|
||||||
|
PINNED_VERSION="" # 空 = latest,否则比如 "3.3.2" 固定版本
|
||||||
while [[ $# -gt 0 ]]; do
|
while [[ $# -gt 0 ]]; do
|
||||||
case "$1" in
|
case "$1" in
|
||||||
--gitea) GITEA_URL="${2}"; shift 2 ;;
|
--gitea) GITEA_URL="${2}"; shift 2 ;;
|
||||||
@@ -66,6 +67,7 @@ while [[ $# -gt 0 ]]; do
|
|||||||
--name) RUNNER_NAME="${2}"; shift 2 ;;
|
--name) RUNNER_NAME="${2}"; shift 2 ;;
|
||||||
--user) RUNNER_USER="${2}"; shift 2 ;;
|
--user) RUNNER_USER="${2}"; shift 2 ;;
|
||||||
--dir) INSTALL_DIR="${2}"; shift 2 ;;
|
--dir) INSTALL_DIR="${2}"; shift 2 ;;
|
||||||
|
--version) PINNED_VERSION="${2#v}"; shift 2 ;;
|
||||||
-h|--help)
|
-h|--help)
|
||||||
sed -n '2,60p' "$0" | sed 's/^# \{0,1\}//'
|
sed -n '2,60p' "$0" | sed 's/^# \{0,1\}//'
|
||||||
exit 0
|
exit 0
|
||||||
@@ -159,22 +161,120 @@ info "✅ 把 ${RUNNER_USER} 加入 docker 组(允许操作 Docker daemon)"
|
|||||||
mkdir -p "${INSTALL_DIR}"
|
mkdir -p "${INSTALL_DIR}"
|
||||||
chown -R "${RUNNER_USER}:${RUNNER_USER}" "${INSTALL_DIR}"
|
chown -R "${RUNNER_USER}:${RUNNER_USER}" "${INSTALL_DIR}"
|
||||||
|
|
||||||
# ---------- 3. 下载最新 act_runner ----------
|
# ---------- 3. 下载最新 Gitea Runner(act_runner 0.x → 3.x 改名 gitea-runner)
|
||||||
info "⬇️ 正在拉取 act_runner 最新 release 元数据..."
|
# 注意:官方从 v3 起,仓库从 gitea/act_runner 改到了 gitea/runner,且文件名前缀从 act_runner-* → gitea-runner-*。
|
||||||
LATEST_JSON="$(curl -fsSL https://gitea.com/api/v1/repos/gitea/act_runner/releases/latest || true)"
|
# 为避免后续版本再改命名导致 404,这里**直接用 API 返回的 assets[].browser_download_url**,不再硬编码拼文件名。
|
||||||
if [[ -z "${LATEST_JSON}" ]]; then
|
# ----------
|
||||||
warn "gitea.com 不通,改用硬编码版本 0.2.10(你之后可手动升级)"
|
# 3.1 决定 release URL(固定版本 or latest)
|
||||||
VERSION="0.2.10"
|
if [[ -n "${PINNED_VERSION}" ]]; then
|
||||||
|
REL_URL="https://gitea.com/api/v1/repos/gitea/runner/releases/tags/v${PINNED_VERSION}"
|
||||||
|
info "⬇️ 你指定了固定版本:v${PINNED_VERSION}"
|
||||||
else
|
else
|
||||||
VERSION="$(echo "${LATEST_JSON}" | grep -oE '"tag_name":\s*"[^"]+"' | head -1 | cut -d'"' -f4 | sed 's/^v//')"
|
REL_URL="https://gitea.com/api/v1/repos/gitea/runner/releases/latest"
|
||||||
[[ -n "${VERSION}" ]] || VERSION="0.2.10"
|
info "⬇️ 正在获取 Gitea Runner 最新 release 元数据..."
|
||||||
fi
|
fi
|
||||||
BIN_URL="https://dl.gitea.com/act_runner/${VERSION}/act_runner-${VERSION}-${PLATFORM}"
|
LATEST_JSON="$(curl -fsSL "${REL_URL}" 2>/dev/null || true)"
|
||||||
info "⬇️ 下载 act_runner v${VERSION}:${BIN_URL}"
|
|
||||||
|
# 3.2 如果 gitea.com 不通(纯内网),直接回退到一个我们已知可用的版本
|
||||||
|
if [[ -z "${LATEST_JSON}" ]]; then
|
||||||
|
if [[ -z "${PINNED_VERSION}" ]]; then
|
||||||
|
warn "gitea.com 访问不到(可能是内网环境),自动回退到已知稳定版本:v3.3.2"
|
||||||
|
PINNED_VERSION="3.3.2"
|
||||||
|
fi
|
||||||
|
TAG="v${PINNED_VERSION}"
|
||||||
|
FALLBACK_MODE=1
|
||||||
|
else
|
||||||
|
TAG="$(echo "${LATEST_JSON}" | grep -oE '"tag_name":\s*"[^"]+"' | head -1 | cut -d'"' -f4)"
|
||||||
|
FALLBACK_MODE=0
|
||||||
|
fi
|
||||||
|
[[ -n "${TAG}" ]] || TAG="v3.3.2"
|
||||||
|
VERSION="${TAG#v}"
|
||||||
|
|
||||||
|
# 3.3 优先从 assets 匹配正确 platform 的 browser_download_url
|
||||||
|
BIN_URL=""
|
||||||
|
ASSET_NAME=""
|
||||||
|
if [[ "${FALLBACK_MODE}" -eq 0 && -n "${LATEST_JSON}" ]]; then
|
||||||
|
# 用 awk 过滤:
|
||||||
|
# - 匹配 PLATFORM(例如 linux-amd64)
|
||||||
|
# - 排除 .xz / .sha256 / .exe 等校验和/压缩包
|
||||||
|
# - 两种前缀都兼容:gitea-runner-X.X.X- (新版) 或 act_runner-X.X.X- (旧版)
|
||||||
|
while IFS='|' read -r name url; do
|
||||||
|
[[ -z "${name}" ]] && continue
|
||||||
|
case "${name}" in
|
||||||
|
*"${PLATFORM}"* | *"${PLATFORM//-/_}"*) ;;
|
||||||
|
*) continue ;;
|
||||||
|
esac
|
||||||
|
case "${name}" in
|
||||||
|
*.xz|*.sha256|*.exe|*.tar.gz|*.zip|*checksums*) continue ;;
|
||||||
|
esac
|
||||||
|
ASSET_NAME="${name}"
|
||||||
|
BIN_URL="${url}"
|
||||||
|
break
|
||||||
|
done < <(echo "${LATEST_JSON}" | awk '
|
||||||
|
/"assets": *\[/ {inA=1; next}
|
||||||
|
inA && /"browser_download_url"/ { gsub(/[",]/,"",$2); url=$2 }
|
||||||
|
inA && /"name"/ {
|
||||||
|
gsub(/[",]/,"",$2)
|
||||||
|
if (url!="") { print $2 "|" url; url="" }
|
||||||
|
}
|
||||||
|
inA && /^\]/ {inA=0}
|
||||||
|
')
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 3.4 如果 assets 匹配失败(老版本 JSON 格式特殊),手动拼 4 个候选 URL 顺序尝试
|
||||||
|
if [[ -z "${BIN_URL}" ]]; then
|
||||||
|
info "assets 自动匹配为空,改用手动候选列表(兼容新旧命名)..."
|
||||||
|
CANDIDATES=(
|
||||||
|
# 新版(v3+)gitea-runner
|
||||||
|
"https://gitea.com/gitea/runner/releases/download/v${VERSION}/gitea-runner-${VERSION}-${PLATFORM}"
|
||||||
|
# github 镜像(有时 gitea.com 慢或挂)
|
||||||
|
"https://github.com/go-gitea/runner/releases/download/v${VERSION}/gitea-runner-${VERSION}-${PLATFORM}"
|
||||||
|
# 旧版 act_runner(v0.2.x 遗留命名)
|
||||||
|
"https://dl.gitea.com/act_runner/${VERSION}/act_runner-${VERSION}-${PLATFORM}"
|
||||||
|
# 旧版 gitea.com
|
||||||
|
"https://gitea.com/gitea/act_runner/releases/download/v${VERSION}/act_runner-${VERSION}-${PLATFORM}"
|
||||||
|
)
|
||||||
|
for C in "${CANDIDATES[@]}"; do
|
||||||
|
info " → 尝试:${C}"
|
||||||
|
if curl -fsSI "${C}" >/dev/null 2>&1; then
|
||||||
|
BIN_URL="${C}"
|
||||||
|
ASSET_NAME="$(basename "${C}")"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 3.5 还没拿到 URL → 打印手动下载指引(一定让用户能救回来)
|
||||||
|
if [[ -z "${BIN_URL}" ]]; then
|
||||||
|
{
|
||||||
|
echo ""
|
||||||
|
echo -e "${RED}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
|
||||||
|
echo -e "${RED} ❌ 自动下载 Gitea Runner 失败${NC}"
|
||||||
|
echo -e "${RED}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
|
||||||
|
echo " 你的架构:${PLATFORM} , 目标版本:${TAG}"
|
||||||
|
echo ""
|
||||||
|
echo " 请在能出网的机器上,手动打开下面 2 个 URL 之一,下载对应的二进制:"
|
||||||
|
echo " • https://gitea.com/gitea/runner/releases/tag/${TAG}"
|
||||||
|
echo " • https://github.com/go-gitea/runner/releases/tag/${TAG}"
|
||||||
|
echo " 找文件名类似:gitea-runner-${VERSION}-${PLATFORM}(不要下 .xz / .sha256)"
|
||||||
|
echo ""
|
||||||
|
echo " 下载完成后 scp 到本服务器并执行:"
|
||||||
|
echo " sudo cp ./gitea-runner-* /usr/local/bin/act_runner"
|
||||||
|
echo " sudo chmod +x /usr/local/bin/act_runner"
|
||||||
|
echo " # 然后重新跑本脚本(已有的用户/组/config 不会重复生成)"
|
||||||
|
echo ""
|
||||||
|
} >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 3.6 真正下载
|
||||||
|
info "⬇️ 下载 Gitea Runner ${TAG}:${ASSET_NAME}"
|
||||||
|
info " URL:${BIN_URL}"
|
||||||
curl -fsSL "${BIN_URL}" -o /usr/local/bin/act_runner \
|
curl -fsSL "${BIN_URL}" -o /usr/local/bin/act_runner \
|
||||||
|| err "下载失败。请手动打开 ${BIN_URL} 看是否 404,然后换个版本"
|
|| err "下载失败!可能是 DNS/网络/证书问题。可以手动把上面 URL 的文件下载下来 scp 到服务器放到 /usr/local/bin/act_runner,再重新跑本脚本。"
|
||||||
chmod +x /usr/local/bin/act_runner
|
chmod +x /usr/local/bin/act_runner
|
||||||
info "✅ act_runner 已安装到 /usr/local/bin,版本:$(act_runner --version 2>&1 || true)"
|
INSTALLED_VER="$(act_runner --version 2>&1 || echo "${TAG}")"
|
||||||
|
ok "✅ 已安装到 /usr/local/bin/act_runner,版本:${INSTALLED_VER}"
|
||||||
|
|
||||||
# ---------- 4. 注册 Runner ----------
|
# ---------- 4. 注册 Runner ----------
|
||||||
cd "${INSTALL_DIR}"
|
cd "${INSTALL_DIR}"
|
||||||
|
|||||||
Reference in New Issue
Block a user