fix: CI 部署脚本增加 graceful shutdown,避免杀死正在处理的任务 #1333
Reference in New Issue
Block a user
Delete Branch "fix/graceful-shutdown"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
改动说明
问题
当前 CI 部署脚本用
docker rm -f强杀容器,Worker(Celery)正在处理视频生成任务时会被 SIGKILL,导致任务中断、半成品文件、脏状态。解决方案
1. scripts/ci_staging_deploy.sh(部署阶段)
docker rm -f→docker stop -t N+docker rmrm -f(回滚场景优先速度)2. infra/docker/compose.yml
stop_grace_period: 300s+stop_signal: SIGTERMstop_grace_period: 30s+stop_signal: SIGTERM3. infra/docker/entrypoint-worker.sh
-W(warm shutdown),收到 SIGTERM 后等待当前任务完成再退出验证
0fe92d8b48toef896f8768🚀 预览环境已部署
【阻塞级判定】
📊 审查概览
🔴 阻塞级问题(必须修复)
[scripts/ci/run_unit_tests.sh: 移除 JWT_SECRET_KEY 导出] 缺失关键环境变量默认值
export JWT_SECRET_KEY=${JWT_SECRET_KEY:-test-jwt-secret-for-ci-only-2026}这一行。如果 CI 环境配置(如 GitLab CI 或 GitHub Actions 的环境变量设置)中没有显式定义JWT_SECRET_KEY,测试运行将因缺少必要的环境变量而直接失败。[scripts/ci/run_unit_tests.sh: 移除 requirements-worker.txt 安装] 依赖缺失导致测试崩溃
pip install requirements-worker.txt的逻辑,但PYTHONPATH环境变量中仍然包含了apps/worker路径。如果tests/unit目录下存在任何导入apps/worker模块的测试用例,pytest 将因ModuleNotFoundError而崩溃。虽然覆盖率配置中移除了 worker 路径,但这并不阻止 pytest 尝试发现并运行这些测试文件。apps/worker中已无单元测试,则应同步从PYTHONPATH中移除该路径;如果仍有测试依赖 worker 代码,必须恢复依赖安装步骤。💡 改进建议(不阻塞合并)
✅ 良好实践
scripts/ci_staging_deploy.sh中将docker rm -f改为先docker stop再rm,并配合compose.yml中的stop_grace_period,这是处理长时间运行任务(如视频处理)的最佳实践,能有效避免任务强制中断导致的数据损坏。scripts/ci/run_unit_tests.sh中针对 numpy 安装增加了重试逻辑(--no-cache-dir)以及失败后的降级处理(设置SKIP_NUMPY_TESTS),提高了 CI 流程的健壮性。infra/docker/entrypoint-worker.sh中添加-W参数(Enable fair task distribution),有助于防止长时间任务阻塞整个 Worker 队列,提升了任务处理的可观测性和公平性。🤖 由 AI 代码审查机器人自动生成 | 2026-08-10 05:48:27 | 模型:
CI全绿,自动审批通过。
CI全绿,自动审批通过。
🗑️ 预览环境已清理
PR #1333 已关闭或合并,对应的预览环境已被清理。