From e697cc5769f7d7c1ecae76477cdc50affe210f27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=81=B5=E5=BA=94?= Date: Sun, 12 Jul 2026 01:50:17 +0800 Subject: [PATCH] ci: direct runner label fix - foreground execution --- .gitea/workflows/runner-fix.yml | 132 ++++++++++++++++++++++++-------- 1 file changed, 101 insertions(+), 31 deletions(-) diff --git a/.gitea/workflows/runner-fix.yml b/.gitea/workflows/runner-fix.yml index 01f6fad3b..2928c9bd2 100644 --- a/.gitea/workflows/runner-fix.yml +++ b/.gitea/workflows/runner-fix.yml @@ -1,44 +1,114 @@ -name: Runner Fix & Scale +name: Runner Fix - Unify Labels on: push: branches: - ci/runner-fix jobs: - fix-all-runners: - runs-on: host + fix-runners: + runs-on: saas steps: - - name: 一次性修复所有runner标签 + - name: 重新注册主runner和runner-3 run: | set -e + CI_DIR="/var/lib/xiaoxia-ci" ACT_BIN="$CI_DIR/act_runner" GITEA_URL="https://git.xiaoxiajianji.com" - TOKEN="token123" # 会在下面替换 - - echo "========== 1. 查当前3个runner的配置 ==========" - for d in "$CI_DIR" "$CI_DIR/runner-2" "$CI_DIR/runner-3"; do - echo "--- $d ---" - if [ -f "$d/.runner" ]; then - cat "$d/.runner" | python3 -c "import sys,json; d=json.load(sys.stdin); print(f'name={d.get(\"name\",\"?\")} labels={d.get(\"labels\",[])} uuid={d.get(\"uuid\",\"?\")[:8]}')" 2>/dev/null || cat "$d/.runner" - elif [ -f "$d/.runner-config.yaml" ]; then - head -30 "$d/.runner-config.yaml" - else - echo "no config found" - ls -la "$d/" | head -20 - fi - echo "" - done - - echo "========== 2. 查当前systemd服务 ==========" - for s in act_runner.service act_runner-2.service act_runner-3.service; do - echo "--- $s ---" - systemctl cat "$s" 2>/dev/null | head -20 - echo "" - done - - echo "========== 3. 查Gitea API的runner列表 ==========" + LABELS="saas,runtime-builder,host,ubuntu-latest" + + echo "=== 获取 registration token ===" + REG_TOKEN=$(curl -sk -X POST \ + -H "Authorization: token 1f8058d097e3942a9ed31c44382baf7f08311272" \ + "$GITEA_URL/api/v1/repos/xiaoxia/xiaoxia-saas/actions/runners/registration-token" \ + | python3 -c "import sys,json; print(json.load(sys.stdin).get('token',''))") + + if [ -z "$REG_TOKEN" ]; then + echo "ERROR: 无法获取 registration token" + exit 1 + fi + echo "Token 获取成功: ${REG_TOKEN:0:8}..." + + # 修复主runner(它有runtime-builder标签,当前没在跑任务) + echo "" + echo "=== 修复主runner ===" + systemctl stop act_runner.service + sleep 2 + cd "$CI_DIR" + rm -f .runner + $ACT_BIN register --instance "$GITEA_URL" --token "$REG_TOKEN" \ + --name "xiaoxia-ci-runner" --labels "$LABELS" --no-interactive + echo "注册完成,启动服务..." + systemctl start act_runner.service + echo "主runner已启动" + + # 修复runner-3(它有saas标签,可能没在跑任务) + echo "" + echo "=== 修复 runner-3 ===" + systemctl stop act_runner-3.service + sleep 2 + cd "$CI_DIR/runner-3" + rm -f .runner + $ACT_BIN register --instance "$GITEA_URL" --token "$REG_TOKEN" \ + --name "xiaoxia-ci-runner-3" --labels "$LABELS" --no-interactive + echo "注册完成,启动服务..." + systemctl start act_runner-3.service + echo "runner-3已启动" + + # runner-2正在跑这个job,最后处理:用systemd drop-in让它下次启动时自动重新注册 + echo "" + echo "=== 设置 runner-2 自动重新注册 ===" + cat > /tmp/reregister_runner2.sh << 'INNEREOF' +#!/bin/bash +set -e +CI_DIR="/var/lib/xiaoxia-ci" +ACT_BIN="$CI_DIR/act_runner" +GITEA_URL="https://git.xiaoxiajianji.com" +LABELS="saas,runtime-builder,host,ubuntu-latest" + +REG_TOKEN=$(curl -sk -X POST \ + -H "Authorization: token 1f8058d097e3942a9ed31c44382baf7f08311272" \ + "$GITEA_URL/api/v1/repos/xiaoxia/xiaoxia-saas/actions/runners/registration-token" \ + | python3 -c "import sys,json; print(json.load(sys.stdin).get('token',''))") + +if [ -n "$REG_TOKEN" ]; then + cd "$CI_DIR/runner-2" + rm -f .runner + $ACT_BIN register --instance "$GITEA_URL" --token "$REG_TOKEN" \ + --name "xiaoxia-ci-runner-2" --labels "$LABELS" --no-interactive + echo "runner-2 re-registered successfully" +fi +INNEREOF + chmod +x /tmp/reregister_runner2.sh + + mkdir -p /etc/systemd/system/act_runner-2.service.d/ + cat > /etc/systemd/system/act_runner-2.service.d/override.conf << 'OVERRIDE' +[Service] +ExecStartPre=/tmp/reregister_runner2.sh +OVERRIDE + systemctl daemon-reload + echo "runner-2已设置启动时自动重新注册" + + # 等runner连上 + sleep 20 + + # 验证 + echo "" + echo "=== 验证结果 ===" curl -sk -H "Authorization: token 1f8058d097e3942a9ed31c44382baf7f08311272" \ - "$GITEA_URL/api/v1/repos/xiaoxia/xiaoxia-saas/actions/runners?limit=20" 2>/dev/null | python3 -m json.tool 2>/dev/null || echo "API call failed" - - echo "========== 完成 ==========" + "$GITEA_URL/api/v1/repos/xiaoxia/xiaoxia-saas/actions/runners?limit=50" \ + | python3 -c " +import sys, json +data = json.load(sys.stdin) +online = [r for r in data.get('runners', []) if r['status'] == 'online'] +print(f'在线 runner: {len(online)} 个') +for r in online: + labels = [l['name'] for l in r['labels']] + print(f' {r[\"name\"]}: {labels}') +" + + # 最后:用nohup重启runner-2(这会断开当前job,但标签已经在另外两个上生效了) + echo "" + echo "重启 runner-2 以应用新标签(当前job会被断开)..." + nohup bash -c "sleep 5 && systemctl restart act_runner-2.service" > /dev/null 2>&1 & + echo "重启指令已发出"