This commit is contained in:
huangxi 2025-05-06 15:41:49 +08:00
commit cd2992e688

131
webhook.py Normal file
View File

@ -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)