graduateDesign/webhook.py
2025-05-06 15:41:56 +08:00

131 lines
5.5 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)