#!/usr/bin/env python3 """将新服务器Runner全部降级为v0.2.6 host模式""" import subprocess import sys import os NEW_SERVER = "172.30.18.199" REG_TOKEN = "ZMFH02WcdElay5ATmhhQYe1WNTESO9XMXcF0H9Tj" GITEA_URL = "https://git.xiaoxiajianji.com" LABELS = "saas,runtime-builder,host,ubuntu-latest,ubuntu-22.04" # 完整PEM格式密钥 KEY_CONTENT = """-----BEGIN OPENSSH PRIVATE KEY----- b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW QyNTUxOQAAACD6GquAk5vBEfbtaJCTSfnQEhjzC8e5GF60hSbPP0BJbAAAAJiQxGNokMRj aAAAAAtzc2gtZWQyNTUxOQAAACD6GquAk5vBEfbtaJCTSfnQEhjzC8e5GF60hSbPP0BJbA AAAED2muzuU4BAiCqbg0ayGxgiDvfS/xI1SFvb32oLzTnn8/oaq4CTm8ER9u1okJNJ+dAS GPMLx7kYXrSFJs8/QElsAAAAFHJ1bm5lci1hZG1pbkB4aWFveGlhAQ== -----END OPENSSH PRIVATE KEY----- """ key_path = "/tmp/new_server_ed25519" with open(key_path, "w") as f: f.write(KEY_CONTENT) os.chmod(key_path, 0o600) # 验证密钥 r = subprocess.run(f"ssh-keygen -y -f {key_path} 2>&1", shell=True, capture_output=True, text=True) print("密钥验证:", r.stdout.strip() or r.stderr.strip()) def ssh(cmd): full_cmd = f'ssh -i {key_path} -o StrictHostKeyChecking=no -o ConnectTimeout=10 root@{NEW_SERVER} "{cmd}"' print(f"\n$ {cmd[:100]}") result = subprocess.run(full_cmd, shell=True, capture_output=True, text=True) if result.stdout: print(result.stdout.strip()[:500]) if result.stderr: err = result.stderr.strip()[:300] if "Connection reset" not in err and "Warning" not in err: print("ERR:", err) if result.returncode != 0: print(f" [RC={result.returncode}]") return result def ssh_check(cmd): r = ssh(cmd) if r.returncode != 0: print("命令失败,退出") sys.exit(1) return r print("=" * 60) print("步骤1: 停止所有现有Runner服务和进程") print("=" * 60) ssh("systemctl stop gitea-runner-1.service gitea-runner-2.service gitea-runner-3.service 2>/dev/null; systemctl stop gitea-runner-4.service gitea-runner-5.service gitea-runner-6.service 2>/dev/null; systemctl disable gitea-runner-*.service 2>/dev/null; pkill -f act_runner 2>/dev/null; sleep 1; echo stopped") print("\n" + "=" * 60) print("步骤2: 备份现有配置") print("=" * 60) ssh_check("cp -r /opt/act-runner /opt/act-runner-backup-$(date +%Y%m%d%H%M) && echo backup_ok") print("\n" + "=" * 60) print("步骤3: 下载v0.2.6 act_runner") print("=" * 60) ssh_check("cd /opt/act-runner && curl -sL -o act_runner_v0.2.6 https://gitea.com/gitea/act_runner/releases/download/v0.2.6/act_runner-0.2.6-linux-amd64 && chmod +x act_runner_v0.2.6 && ./act_runner_v0.2.6 --version") print("\n" + "=" * 60) print("步骤4: 注册6个仓库级Runner (host模式)") print("=" * 60) import base64 for i in range(1, 7): print(f"\n--- 注册 Runner {i} ---") reg_script = f"""cd /opt/act-runner/runner-{i} rm -f .runner 2>/dev/null /opt/act-runner/act_runner_v0.2.6 register --instance {GITEA_URL} --token {REG_TOKEN} --name xiaoxia-ci-runner-new-{i} --labels {LABELS} --no-interactive 2>&1 echo DONE_REG_{i}""" # 先创建目录 ssh(f"mkdir -p /opt/act-runner/runner-{i}") r = ssh(reg_script) print("\n" + "=" * 60) print("步骤5: 创建systemd服务") print("=" * 60) for i in range(1, 7): service_content = f"""[Unit] Description=Gitea Act Runner {i} After=network.target [Service] Type=simple User=root WorkingDirectory=/opt/act-runner/runner-{i} ExecStart=/opt/act-runner/act_runner_v0.2.6 daemon Restart=always RestartSec=5 [Install] WantedBy=multi-user.target """ content_b64 = base64.b64encode(service_content.encode()).decode() ssh(f"echo '{content_b64}' | base64 -d > /etc/systemd/system/act-runner-{i}.service && echo svc_{i}_ok") print("\n" + "=" * 60) print("步骤6: 启动所有Runner") print("=" * 60) ssh("systemctl daemon-reload") for i in range(1, 7): ssh(f"systemctl enable act-runner-{i}.service && systemctl start act-runner-{i}.service && echo start_{i}_ok") print("\n--- 检查状态 ---") ssh("sleep 3; ps aux | grep act_runner_v0.2.6 | grep -v grep | wc -l; echo '个进程运行中'; for i in 1 2 3 4 5 6; do systemctl is-active act-runner-$i.service | tr '\\n' ' '; done; echo") print("\n" + "=" * 60) print("全部完成!") print("=" * 60)