2828from app .schemas import VisitorData
2929from app .schemas .response import APIResponse
3030from app .schemas .schemas import BlogPostIn , BlogPostUpdate
31+ from app .tasks import send_feishu_message
3132from app .utils import redis_cache
3233
3334router = APIRouter (prefix = "/admin" , tags = ["admin" ])
@@ -448,8 +449,10 @@ async def track_visitor(
448449async def run_deployment () -> None :
449450 """异步执行部署脚本不阻塞HTTP请求"""
450451 try :
451- logger .info ("Starting deployment process..." )
452+ logger .info ("启动自动化部署..." )
453+ import time
452454
455+ start_time = time .time ()
453456 # 部署脚本路径,根据你的实际情况修改
454457 deploy_script = "/home/kano/blog/backend/deploy.sh"
455458
@@ -468,12 +471,12 @@ async def run_deployment() -> None:
468471 stdout , stderr = await process .communicate ()
469472
470473 if process .returncode == 0 :
471- logger .info ("Deployment completed successfully!" )
472- logger .debug (f"Deploy output: { stdout .decode ()} " )
474+ end_time : float = time .time ()
475+ elapsed_time : float = end_time - start_time
476+ logger .info (f"✅自动化部署完成,耗时 { elapsed_time :.2f} 秒" )
477+ logger .debug (f"✅Deploy output: { stdout .decode ()} " )
473478 else :
474- logger .error (
475- f"Deployment failed with exit code { process .returncode } "
476- )
479+ logger .error (f"❌自动化部署失败,退出码: { process .returncode } " )
477480 logger .error (f"STDOUT: { stdout .decode ()} " )
478481 logger .error (f"STDERR: { stderr .decode ()} " )
479482
@@ -490,7 +493,7 @@ async def webhook_deploy(
490493 Gitee Webhook 自动部署接口
491494 """
492495 # 从环境变量获取webhook密钥,需要在.env中配置
493- webhook_secret = get_settings ().GITEE_WEBHOOK_SECRET
496+ webhook_secret : str | None = get_settings ().GITEE_WEBHOOK_SECRET
494497 if not webhook_secret :
495498 logger .error (
496499 "GITEE_WEBHOOK_SECRET is not set in environment variables"
@@ -557,9 +560,29 @@ async def webhook_deploy(
557560 f"Deployment triggered by webhook from { get_remote_address (request )} "
558561 )
559562
560- # 使用asyncio.create_task在后台执行部署,不阻塞请求
561- asyncio .create_task (run_deployment ()) # noqa: RUF006
562-
563- return APIResponse .ok (
564- message = "Deployment triggered successfully" , data = {"status" : "pending" }
563+ lock_acquired = await redis .set (
564+ name = "deploy_lock" , value = "1" , ex = 300 , nx = True
565565 )
566+ if not lock_acquired :
567+ logger .info ("Deployment already in progress, skipping" )
568+ return APIResponse .ok (
569+ message = "Deployment already in progress" ,
570+ data = {"status" : "in_progress" },
571+ )
572+ try :
573+ logger .info (
574+ f"Deployment triggered by webhook from { get_remote_address (request )} "
575+ )
576+ await send_feishu_message .kiq ("API服务正在部署中,请稍候..." )
577+ asyncio .create_task (run_deployment ()) # noqa: RUF006
578+ return APIResponse .ok (
579+ message = "Deployment triggered successfully" ,
580+ data = {"status" : "pending" },
581+ )
582+ except Exception as e :
583+ await redis .delete ("deploy_lock" )
584+ logger .error (f"Failed to trigger deployment: { e !s} " )
585+ return APIResponse .error (
586+ message = "Failed to trigger deployment" ,
587+ code = status .HTTP_500_INTERNAL_SERVER_ERROR ,
588+ )
0 commit comments