ci: re-register all 3 runners with unified labels
Runner Diagnose / diagnose (push) Successful in 0s
Runner Fix & Scale / fix-all-runners (push) Successful in 0s

This commit is contained in:
灵应
2026-07-12 01:39:29 +08:00
parent db9c6eced8
commit 1ceeb191ea
+150
View File
@@ -0,0 +1,150 @@
name: Runner Re-register All
on:
push:
branches:
- ci/runner-fix
jobs:
reregister:
runs-on: host
steps:
- name: 全部删除并重新注册3个runner(统一标签)
run: |
set -e
CI_DIR="/var/lib/xiaoxia-ci"
ACT_BIN="$CI_DIR/act_runner"
GITEA_URL="https://git.xiaoxiajianji.com"
REG_TOKEN="ZMFH02WcdElay5ATmhhQYe1WNTESO9XMXcF0H9Tj"
LABELS="saas,runtime-builder,host,ubuntu-latest"
echo "========== 1. 停止所有runner服务 =========="
systemctl stop act_runner.service act_runner-2.service act_runner-3.service 2>&1 || true
sleep 3
# 确保进程全死
pkill -f "act_runner daemon" 2>/dev/null || true
sleep 2
echo "已停止所有runner"
echo ""
echo "========== 2. 清理所有旧runner配置 =========="
# 备份旧配置
cd "$CI_DIR"
[ -f .runner ] && cp .runner .runner.bak.main
[ -f runner-2/.runner ] && cp runner-2/.runner runner-2/.runner.bak
[ -f runner-3/.runner ] && cp runner-3/.runner runner-3/.runner.bak
# 删除旧配置(强制重新注册)
rm -f .runner runner-2/.runner runner-3/.runner
echo "旧配置已删除并备份"
echo ""
echo "========== 3. 用统一标签重新注册主runner =========="
cd "$CI_DIR"
$ACT_BIN register \
--instance "$GITEA_URL" \
--token "$REG_TOKEN" \
--name "xiaoxia-ci-runner" \
--labels "$LABELS" \
--no-interactive 2>&1
echo "主runner注册完成"
echo ""
echo "========== 4. 用统一标签重新注册 runner-2 =========="
cd "$CI_DIR/runner-2"
$ACT_BIN register \
--instance "$GITEA_URL" \
--token "$REG_TOKEN" \
--name "xiaoxia-ci-runner-2" \
--labels "$LABELS" \
--no-interactive 2>&1
echo "runner-2注册完成"
echo ""
echo "========== 5. 用统一标签重新注册 runner-3 =========="
cd "$CI_DIR/runner-3"
$ACT_BIN register \
--instance "$GITEA_URL" \
--token "$REG_TOKEN" \
--name "xiaoxia-ci-runner-3" \
--labels "$LABELS" \
--no-interactive 2>&1
echo "runner-3注册完成"
echo ""
echo "========== 6. 验证新配置 =========="
for d in "$CI_DIR" "$CI_DIR/runner-2" "$CI_DIR/runner-3"; do
echo "--- $d ---"
cat "$d/.runner" | python3 -c "import sys,json; d=json.load(sys.stdin); print(f'name={d[\"name\"]} labels={d[\"labels\"]}')" 2>/dev/null || echo "read failed"
done
echo ""
echo "========== 7. 启动所有runner服务 =========="
systemctl start act_runner.service act_runner-2.service act_runner-3.service
sleep 8
for s in act_runner.service act_runner-2.service act_runner-3.service; do
status=$(systemctl is-active $s 2>/dev/null || echo "unknown")
echo "$s: $status"
done
echo ""
echo "========== 8. 验证服务端runner状态(等15秒连接)=========="
sleep 15
python3 << 'PYEOF'
import urllib.request, json, ssl
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
req = urllib.request.Request(
"https://git.xiaoxiajianji.com/api/v1/repos/xiaoxia/xiaoxia-saas/actions/runners?limit=50",
headers={"Authorization": "token 1f8058d097e3942a9ed31c44382baf7f08311272"}
)
resp = urllib.request.urlopen(req, context=ctx)
data = json.loads(resp.read())
online = [r for r in data.get("runners", []) if r["status"] == "online"]
offline = [r for r in data.get("runners", []) if r["status"] == "offline"]
print(f"在线runner: {len(online)}")
for r in online:
labels = [l["name"] for l in r["labels"]]
print(f" ✅ id={r['id']} {r['name']} labels={labels}")
print(f"\n离线runner: {len(offline)}")
if len(offline) > 0:
# 删除所有offline的
deleted = 0
for r in offline:
del_req = urllib.request.Request(
f"https://git.xiaoxiajianji.com/api/v1/repos/xiaoxia/xiaoxia-saas/actions/runners/{r['id']}",
headers={"Authorization": "token 1f8058d097e3942a9ed31c44382baf7f08311272"},
method="DELETE"
)
try:
urllib.request.urlopen(del_req, context=ctx)
deleted += 1
except:
pass
print(f" 已清理 {deleted} 个离线runner")
# 再查一遍
req2 = urllib.request.Request(
"https://git.xiaoxiajianji.com/api/v1/repos/xiaoxia/xiaoxia-saas/actions/runners?limit=50",
headers={"Authorization": "token 1f8058d097e3942a9ed31c44382baf7f08311272"}
)
resp2 = urllib.request.urlopen(req2, context=ctx)
data2 = json.loads(resp2.read())
final_online = [r for r in data2.get("runners", []) if r["status"] == "online"]
final_offline = [r for r in data2.get("runners", []) if r["status"] == "offline"]
print(f"\n最终状态:在线 {len(final_online)} / 离线 {len(final_offline)}")
if len(final_online) == 3:
print("🎉 CI runner扩容完成!3个runner全部在线,标签统一")
else:
print(f"⚠️ 预期3个在线,实际{len(final_online)}个")
PYEOF
echo ""
echo "========== 全部完成 =========="