#!/usr/bin/env bash # ============================================================================ # setup-runner.sh —— 一键安装并注册 Gitea Actions Runner(act_runner) # # 使用方法: # ① 先在你的 Gitea 仓库页面 → Settings → Actions → Runners → 「Create Runner」 # 选「Linux + amd64」,它会给你一条注册命令,里面有一串 registration token, # 格式像: GFxxxxxxxxxxxxxxxxxxxx ,复制它。 # ② 再在你要跑 Runner 的机器上执行: # curl -fsSL https://<你的-gitea>/<仓库>/-/raw/branch/main/scripts/setup-runner.sh \ # | sudo bash -s -- --gitea https://<你的-gitea> --token GFxxxxxxxxxxxxxxxxxxxx # # 或者直接本地执行: # sudo bash scripts/setup-runner.sh \ # --gitea https://git.baoyiwai.com \ # --token GFxxxxxxxxxxxxxxxxxxxxxxxxxxxx # ============================================================================ set -euo pipefail # ---------- 颜色 ---------- RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m' info() { echo -e "${GREEN}[INFO]${NC} $*"; } warn() { echo -e "${YELLOW}[WARN]${NC} $*"; } err() { echo -e "${RED}[ERROR]${NC} $*" >&2; exit 1; } # ---------- 解析参数 ---------- GITEA_URL="" REG_TOKEN="" RUNNER_NAME="runner-$(hostname | tr '[:upper:]' '[:lower:]')" RUNNER_USER="gitrunner" INSTALL_DIR="/opt/act_runner" while [[ $# -gt 0 ]]; do case "$1" in --gitea) GITEA_URL="${2}"; shift 2 ;; --token) REG_TOKEN="${2}"; shift 2 ;; --name) RUNNER_NAME="${2}"; shift 2 ;; --user) RUNNER_USER="${2}"; shift 2 ;; --dir) INSTALL_DIR="${2}"; shift 2 ;; -h|--help) sed -n '2,20p' "$0" | sed 's/^# \{0,1\}//' exit 0 ;; *) err "未知参数:$1(--help 查看帮助)" ;; esac done [[ -n "${GITEA_URL}" ]] || err "必须传 --gitea https://你的-gitea-地址" [[ -n "${REG_TOKEN}" ]] || err "必须传 --token GF……(Gitea 页面里拿的注册 token)" [[ $EUID -eq 0 ]] || err "请用 sudo 运行本脚本(需要写 /opt / /etc/systemd/system)" # 去掉末尾 / GITEA_URL="${GITEA_URL%/}" # ---------- 0. 架构检测 ---------- ARCH="$(uname -m)" case "${ARCH}" in x86_64|amd64) PLATFORM="linux-amd64" ;; aarch64|arm64) PLATFORM="linux-arm64" ;; armv7l) PLATFORM="linux-arm" ;; *) err "暂不支持的架构:${ARCH}(需要 x86_64 / aarch64 / armv7)" ;; esac info "检测到架构:${ARCH} → 下载版本:${PLATFORM}" # ---------- 1. 安装依赖:docker(Runner 要用 Docker-in-Docker 执行 buildx 等)---------- if ! command -v docker >/dev/null 2>&1; then info "检测到没装 Docker,现在用官方一键脚本安装(国内自动换清华源)..." curl -fsSL https://get.docker.com -o /tmp/get-docker.sh || err "下载 docker-install 脚本失败" if curl -sI https://mirrors.tuna.tsinghua.edu.cn >/dev/null; then bash /tmp/get-docker.sh --mirror Aliyun || bash /tmp/get-docker.sh else bash /tmp/get-docker.sh fi systemctl enable --now docker info "✅ Docker 安装完成:$(docker --version)" else info "✅ Docker 已存在:$(docker --version)" fi # ---------- 2. 建运行用户 gitrunner,加入 docker 组 ---------- if ! id -u "${RUNNER_USER}" >/dev/null 2>&1; then useradd -r -s /usr/sbin/nologin -d "${INSTALL_DIR}" "${RUNNER_USER}" info "✅ 新建系统用户 ${RUNNER_USER}" else info "ℹ️ 用户 ${RUNNER_USER} 已存在,跳过创建" fi usermod -aG docker "${RUNNER_USER}" 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" else VERSION="$(echo "${LATEST_JSON}" | grep -oE '"tag_name":\s*"[^"]+"' | head -1 | cut -d'"' -f4 | sed 's/^v//')" [[ -n "${VERSION}" ]] || VERSION="0.2.10" fi BIN_URL="https://dl.gitea.com/act_runner/${VERSION}/act_runner-${VERSION}-${PLATFORM}" info "⬇️ 下载 act_runner v${VERSION}:${BIN_URL}" curl -fsSL "${BIN_URL}" -o /usr/local/bin/act_runner \ || err "下载失败。请手动打开 ${BIN_URL} 看是否 404,然后换个版本" chmod +x /usr/local/bin/act_runner info "✅ act_runner 已安装到 /usr/local/bin,版本:$(act_runner --version 2>&1 || true)" # ---------- 4. 注册 Runner ---------- cd "${INSTALL_DIR}" info "🔗 开始注册 Runner 到 ${GITEA_URL}(名称:${RUNNER_NAME})" # 切到 gitrunner 用户注册,避免 root 跑(安全) rm -f .runner 2>/dev/null || true sudo -u "${RUNNER_USER}" env HOME="${INSTALL_DIR}" \ act_runner register \ --instance "${GITEA_URL}" \ --token "${REG_TOKEN}" \ --name "${RUNNER_NAME}" \ --labels "ubuntu-latest:docker://catthehacker/ubuntu:act-22.04" \ --no-interactive \ || err "注册失败!常见原因:\n 1) token 不对(复制时别带空格)\n 2) Runner 机器出不了网到 ${GITEA_URL}\n 3) Gitea 站点时间和这台机器差太远(证书验证失败)" chown "${RUNNER_USER}:${RUNNER_USER}" .runner 2>/dev/null || true # ---------- 5. 生成配置文件(建议开启 docker.host 特权)---------- CONFIG_FILE="${INSTALL_DIR}/config.yaml" if [[ ! -f "${CONFIG_FILE}" ]]; then cat > "${CONFIG_FILE}" <<'YAML' log: level: info runner: file: .runner capacity: 2 # 同一台 Runner 最多同时跑 2 个 Job envs: GOPROXY: https://goproxy.cn,direct NPM_CONFIG_REGISTRY: https://registry.npmmirror.com timeout: 3h cache: enabled: true dir: /opt/act_runner/cache container: network: "bridge" privileged: true # build-push-action 用到 Docker daemon options: | --add-host "host.docker.internal:host-gateway" YAML chown "${RUNNER_USER}:${RUNNER_USER}" "${CONFIG_FILE}" mkdir -p "${INSTALL_DIR}/cache" chown -R "${RUNNER_USER}:${RUNNER_USER}" "${INSTALL_DIR}/cache" info "✅ 默认 config 写入 ${CONFIG_FILE}" fi # ---------- 6. 写 systemd 服务,开机自启 ---------- UNIT_FILE="/etc/systemd/system/gitea-act-runner.service" cat > "${UNIT_FILE}" <