From cd2992e68875f62da8eb9c60e30e14f97e807a25 Mon Sep 17 00:00:00 2001 From: huangxi <854692090@qq.com> Date: Tue, 6 May 2025 15:41:49 +0800 Subject: [PATCH] init --- webhook.py | 131 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 webhook.py diff --git a/webhook.py b/webhook.py new file mode 100644 index 0000000..abff12d --- /dev/null +++ b/webhook.py @@ -0,0 +1,131 @@ +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) \ No newline at end of file