From a027816831e667cf5df65d3b62f92d8188d7173b Mon Sep 17 00:00:00 2001 From: HenryDu8133 <813367384@qq.com> Date: Sun, 6 Sep 2026 09:13:06 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20Gitea=20Runner=20?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=20404=EF=BC=88v3+=20=E6=94=B9=E5=90=8D=20git?= =?UTF-8?q?ea-runner=EF=BC=8C=E6=94=B9=E4=B8=BA=20assets=20=E5=8C=B9?= =?UTF-8?q?=E9=85=8D=20+=20=E5=A4=9A=E6=BA=90=E5=9B=9E=E9=80=80=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/setup-runner.sh | 138 ++++++++++++++++++++++++++++++++++------ 1 file changed, 119 insertions(+), 19 deletions(-) diff --git a/scripts/setup-runner.sh b/scripts/setup-runner.sh index 2929fee..5ee9b05 100644 --- a/scripts/setup-runner.sh +++ b/scripts/setup-runner.sh @@ -40,6 +40,7 @@ # --name "my-runner-01" 自定义 Runner 名字(默认是 runner-主机名) # --user gitrunner 运行用户(默认 gitrunner) # --dir /opt/act_runner 安装目录(默认 /opt/act_runner) +# --version 3.3.2 【可选】固定安装某版本,不写默认用 Gitea 官方 latest # ============================================================================ set -euo pipefail @@ -57,15 +58,16 @@ SCOPE="repo" # repo | org | global(默认 repo,绝大多数人的场景) RUNNER_NAME="runner-$(hostname | tr '[:upper:]' '[:lower:]')" RUNNER_USER="gitrunner" INSTALL_DIR="/opt/act_runner" - +PINNED_VERSION="" # 空 = latest,否则比如 "3.3.2" 固定版本 while [[ $# -gt 0 ]]; do case "$1" in - --gitea) GITEA_URL="${2}"; shift 2 ;; - --token) REG_TOKEN="${2}"; shift 2 ;; - --scope) SCOPE="${2}"; shift 2 ;; - --name) RUNNER_NAME="${2}"; shift 2 ;; - --user) RUNNER_USER="${2}"; shift 2 ;; - --dir) INSTALL_DIR="${2}"; shift 2 ;; + --gitea) GITEA_URL="${2}"; shift 2 ;; + --token) REG_TOKEN="${2}"; shift 2 ;; + --scope) SCOPE="${2}"; shift 2 ;; + --name) RUNNER_NAME="${2}"; shift 2 ;; + --user) RUNNER_USER="${2}"; shift 2 ;; + --dir) INSTALL_DIR="${2}"; shift 2 ;; + --version) PINNED_VERSION="${2#v}"; shift 2 ;; -h|--help) sed -n '2,60p' "$0" | sed 's/^# \{0,1\}//' exit 0 @@ -159,22 +161,120 @@ info "✅ 把 ${RUNNER_USER} 加入 docker 组(允许操作 Docker daemon)" mkdir -p "${INSTALL_DIR}" chown -R "${RUNNER_USER}:${RUNNER_USER}" "${INSTALL_DIR}" -# ---------- 3. 下载最新 act_runner ---------- -info "⬇️ 正在拉取 act_runner 最新 release 元数据..." -LATEST_JSON="$(curl -fsSL https://gitea.com/api/v1/repos/gitea/act_runner/releases/latest || true)" -if [[ -z "${LATEST_JSON}" ]]; then - warn "gitea.com 不通,改用硬编码版本 0.2.10(你之后可手动升级)" - VERSION="0.2.10" +# ---------- 3. 下载最新 Gitea Runner(act_runner 0.x → 3.x 改名 gitea-runner) +# 注意:官方从 v3 起,仓库从 gitea/act_runner 改到了 gitea/runner,且文件名前缀从 act_runner-* → gitea-runner-*。 +# 为避免后续版本再改命名导致 404,这里**直接用 API 返回的 assets[].browser_download_url**,不再硬编码拼文件名。 +# ---------- +# 3.1 决定 release URL(固定版本 or latest) +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 - VERSION="$(echo "${LATEST_JSON}" | grep -oE '"tag_name":\s*"[^"]+"' | head -1 | cut -d'"' -f4 | sed 's/^v//')" - [[ -n "${VERSION}" ]] || VERSION="0.2.10" + REL_URL="https://gitea.com/api/v1/repos/gitea/runner/releases/latest" + info "⬇️ 正在获取 Gitea Runner 最新 release 元数据..." fi -BIN_URL="https://dl.gitea.com/act_runner/${VERSION}/act_runner-${VERSION}-${PLATFORM}" -info "⬇️ 下载 act_runner v${VERSION}:${BIN_URL}" +LATEST_JSON="$(curl -fsSL "${REL_URL}" 2>/dev/null || true)" + +# 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 \ - || err "下载失败。请手动打开 ${BIN_URL} 看是否 404,然后换个版本" + || err "下载失败!可能是 DNS/网络/证书问题。可以手动把上面 URL 的文件下载下来 scp 到服务器放到 /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 ---------- cd "${INSTALL_DIR}"