perf(ci): 流水线提速 - 路径过滤/持久builder缓存/依赖缓存卷/部署job迁移ci-l2 #1536
Reference in New Issue
Block a user
Delete Branch "ci/ci-speedup-phase1"
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 流水线提速(小改动部署慢优化)
背景
develop 推送小改动:三镜像全量构建
8min、代码质量检查 1013min(每次现装工具)、后端单测 14min(每次现 pip install),staging 端到端 ~10min。实际部署只需 1.5min。改动内容
1. build-staging 路径过滤(新增 check-push-paths job)
retag-staging-skippedjob:把 registry 上:develop/:main分支 tag retag 为新 SHA 并推送2. deploy-staging、acr-cleanup 迁移
3. buildx 持久 builder + 本地层缓存
ci-builder-persist(docker-container driver, host 网络),层缓存保存在 buildkit 命名卷,跨 job 共享docker buildx prune -af;残留容器由宿主机 ci-docker-cleanup.sh 兜底(已加白名单豁免持久 builder)4. 依赖缓存到宿主机命名卷(act-toolcache 模式)
ci-pip-cache:/root/.cache/pip、xiaoxia-npm-cache:/root/.npm、act-toolcache:/opt/act-toolcache不改动
宿主机配套(已完成)
🚀 预览环境已部署
CI全绿,自动审批通过。
CI全绿,自动审批通过。
【阻塞级判定】
📊 审查概览
🔴 阻塞级问题(必须修复)
[scripts/ci/ensure_persistent_builder.sh: 15-21] 竞态条件导致并发构建失败
if ! inspect ... then create ... fi的模式来确保 builder 存在。在 CI 并发场景下(如build-staging的 matrix 任务并行启动),如果多个任务同时检测到 builder 不存在,都会尝试执行create。第二个任务会因 "builder already exists" 报错并退出(set -eu),导致 CI 流程不稳定。docker buildx create命令后追加|| true,或者捕获特定错误码,确保创建失败时脚本不退出,因为此时 builder 实际上已经存在了。[scripts/ci/docker_build_push.sh: 90-94] 并发任务间的资源冲突风险
docker buildx rm删除 builder 并重建。由于ci-builder-persist是跨 Job 共享的持久资源,如果 Job A(如构建 API)正在执行,Job B(如构建 Web)因缓存损坏触发删除操作,会导致 Job A 的构建进程突然崩溃(连接断开或 builder 消失),造成无辜的构建任务失败。💡 改进建议(不阻塞合并)
[scripts/ci/docker_build_only.sh: 22-35] 缺少缓存损坏的容错机制
docker_build_push.sh中已经增加了检测缓存损坏并重建 builder 的逻辑,但docker_build_only.sh(用于 PR 验证)中未包含此逻辑。如果持久 builder 缓存损坏,PR 检查会直接失败,需要手动重试。建议同步添加类似的容错逻辑,或至少在注释中说明差异原因。[scripts/ci/retag_skipped_image.sh: 30-36] 镜像拉取缺少重试机制
docker pull拉取候选镜像时,如果网络抖动导致失败,会直接跳过该候选源。如果所有候选源都因此失败,任务会报错。建议对docker pull命令增加简单的重试逻辑(如重试 2 次),以提高 CI 的鲁棒性。✅ 良好实践
ci-builder-persist) 并利用宿主机卷缓存,能有效减少重复下载依赖,显著提升构建速度。check-push-paths逻辑设计严密,在无法判断变更时默认全量构建,符合 "安全兜底" 的最佳实践。retag-staging-skipped机制巧妙地解决了部分构建场景下的 Watchtower 触发问题,保证了部署的一致性。🤖 由 AI 代码审查机器人自动生成 | 2026-08-29 05:31:13 | 模型:
🗑️ 预览环境已清理
PR #1536 已关闭或合并,对应的预览环境已被清理。