init
This commit is contained in:
commit
cd2992e688
131
webhook.py
Normal file
131
webhook.py
Normal 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)
|
Loading…
x
Reference in New Issue
Block a user