import subprocess from flask import Flask, request, jsonify import logging import socket import os import shutil # 配置日志 logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') logger = logging.getLogger(__name__) app = Flask(__name__) WEBHOOK_TOKEN = "gitea_webhook_token_2024" # 设置一个固定的token PROJECT_PATH = "/www/wwwroot/Jewlery_Classification" # 设置项目路径 GIT_REPO_URL = "http://gitea.petutopia.chat/huangxi/graduateDesign.git" # 设置git仓库地址 def init_git_repo(): """初始化git仓库""" try: # 检查目录是否存在 if not os.path.exists(PROJECT_PATH): logger.info(f"创建项目目录: {PROJECT_PATH}") os.makedirs(PROJECT_PATH, exist_ok=True) # 检查是否是git仓库 if not os.path.exists(os.path.join(PROJECT_PATH, '.git')): logger.info("目录不是git仓库,开始初始化...") # 如果目录不为空,先清空 if os.listdir(PROJECT_PATH): logger.info("目录不为空,清空目录...") shutil.rmtree(PROJECT_PATH) os.makedirs(PROJECT_PATH) # 克隆仓库 logger.info(f"开始克隆仓库: {GIT_REPO_URL}") result = subprocess.run(["git", "clone", GIT_REPO_URL, PROJECT_PATH], capture_output=True, text=True, check=True) logger.info(f"克隆输出: {result.stdout}") logger.info("仓库克隆完成") else: # 配置git logger.info("配置git...") subprocess.run(["git", "-C", PROJECT_PATH, "config", "--local", "user.name", "webhook"], check=True) subprocess.run(["git", "-C", PROJECT_PATH, "config", "--local", "user.email", "webhook@example.com"], check=True) # 确保远程仓库配置正确 logger.info("检查远程仓库配置...") result = subprocess.run(["git", "-C", PROJECT_PATH, "remote", "-v"], capture_output=True, text=True, check=True) logger.info(f"当前远程仓库配置: {result.stdout}") if "origin" not in result.stdout: logger.info("添加远程仓库...") subprocess.run(["git", "-C", PROJECT_PATH, "remote", "add", "origin", GIT_REPO_URL], check=True) return True except Exception as e: logger.error(f"初始化git仓库失败: {str(e)}", exc_info=True) return False @app.route('/', methods=['GET']) def index(): logger.info("收到根路径访问请求") return "Webhook服务器正在运行" @app.route('/webhook', methods=['POST']) def handle_webhook(): logger.info("收到新的webhook请求") logger.info(f"请求头: {dict(request.headers)}") # 验证请求签名 received_token = request.headers.get('X-Gitea-Signature') logger.info(f"收到的token: {received_token}") logger.info(f"期望的token: {WEBHOOK_TOKEN}") if received_token != WEBHOOK_TOKEN: logger.warning("Token验证失败") return jsonify({"status": "invalid token"}), 403 event = request.headers.get('X-Gitea-Event') payload = request.json logger.info(f"事件类型: {event}") logger.info(f"请求体: {payload}") # 只处理push事件 if event == 'push' and payload['ref'] == 'refs/heads/master': logger.info("检测到master分支的push事件,开始处理") try: # 初始化git仓库 if not init_git_repo(): raise Exception("初始化git仓库失败") # 拉取最新代码 logger.info("开始拉取最新代码...") result = subprocess.run(["git", "-C", PROJECT_PATH, "pull", "origin", "master"], capture_output=True, text=True, check=True) logger.info(f"拉取输出: {result.stdout}") logger.info("代码拉取成功") # 重启服务 logger.info("开始重启服务...") logger.info("终止旧进程...") subprocess.run(["pkill", "-f", "server.py"]) logger.info("启动新进程...") subprocess.Popen(["python3", f"{PROJECT_PATH}/server.py"], stdout=open(f"{PROJECT_PATH}/server.log", 'a'), stderr=subprocess.STDOUT) logger.info("服务重启完成") return jsonify({"status": "success"}), 200 except Exception as e: logger.error(f"处理过程中发生错误: {str(e)}", exc_info=True) return jsonify({"error": str(e)}), 500 logger.info("忽略非master分支的push事件或其他类型事件") return jsonify({"status": "ignored event"}), 200 if __name__ == '__main__': try: # 获取本机IP地址 hostname = socket.gethostname() local_ip = socket.gethostbyname(hostname) logger.info(f"服务器主机名: {hostname}") logger.info(f"服务器IP地址: {local_ip}") logger.info(f"Webhook服务器启动在 0.0.0.0:9001") logger.info("你可以通过以下地址访问服务器:") logger.info(f"- 本地访问: http://127.0.0.1:9001") logger.info(f"- 局域网访问: http://{local_ip}:9001") app.run(host='0.0.0.0', port=9001, debug=True) except Exception as e: logger.error(f"服务器启动失败: {str(e)}", exc_info=True)