perf(worker): optimize worker image build with unified base image #1430
Reference in New Issue
Block a user
Delete Branch "perf/worker-base-image"
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?
问题
Build Staging Worker Image耗时 18m29s,是所有构建 job 中最慢的。根因:worker.Dockerfile仍做pip install requirements.txt+apt install fonts-noto-cjkdocker_build_push.sh(buildx + registry cache)增加大量开销修复方案(参照 API base 成功模式)
1. 新建
infra/docker/worker-base.Dockerfile统一基础镜像,预装全部依赖:
2. 简化
infra/docker/worker.Dockerfilepip install requirements.txtapt-get install fonts-noto-cjk3. 更新
worker-base-image.ymlsaas-worker-base镜像(替代旧的 builder/runtime 两个镜像)requirements.txt4. 更新
ci-pipeline.yml预期效果
关联
Fixes #1421
🚀 预览环境已部署
【阻塞级判定】
📊 审查概览
🔴 阻塞级问题(必须修复)
requirements.txt(业务依赖)的安装操作移入了infra/docker/worker-base.Dockerfile,这意味着业务依赖被“烘焙”进了基础镜像saas-worker-base:latest中。然而,
.gitea/workflows/worker-base-image.yml仅在推送到main分支且requirements.txt发生变更时才会触发构建并推送新基础镜像。在 PR 的 CI 流程(
.gitea/workflows/ci-pipeline.yml)中,"Pre-build worker base image" 步骤仅执行docker pull检查镜像是否存在。如果远程镜像存在(即使是旧的),CI 将直接使用该旧镜像,而不会检测当前 PR 代码中requirements.txt是否已修改。requirements.txt(例如新增或升级了依赖库),PR 的 CI 构建将使用旧的main分支基础镜像,导致构建出的 Worker 镜像中缺少新依赖或版本不匹配。这将导致测试结果无效(假阴性),或者合并到main后因基础镜像未及时更新而引发运行时错误。ci-pipeline.yml的 "Pre-build worker base image" 步骤中增加逻辑,使用git diff检测requirements.txt相对于main分支是否有变更。如果有变更,强制执行本地构建docker build -f infra/docker/worker-base.Dockerfile ...,覆盖拉取到的远程镜像。requirements.txt的安装保留在worker.Dockerfile中,不放入预构建的worker-base.Dockerfile,仅将变化较少的requirements-base.txt和requirements-worker.txt放入基础镜像。💡 改进建议(不阻塞合并)
无
✅ 良好实践
docker image prune),有助于节省 Runner 磁盘空间。✅ 格式检查通过 | ❌ 逻辑审查需修改 | ✅ 性能良好
🤖 由 AI 代码审查机器人自动生成 | 2026-08-18 14:00:57 | 模型:
CI全绿,自动审批通过。
CI全绿,自动审批通过。
✅ CI 全绿,请 review
CI Run #33183 全部通过:
改动摘要
infra/docker/worker-base.Dockerfile— 统一 Worker 基础镜像,预装全部系统依赖和 Python 依赖infra/docker/worker.Dockerfile— FROM 预构建基础镜像,去掉 pip install 和 apt install.gitea/workflows/worker-base-image.yml— 简化为构建单一saas-worker-base镜像.gitea/workflows/ci-pipeline.yml— Worker 构建改用 plain docker build(不走 buildx),保留 fallback 机制合并后需要手动触发
worker-base-image.yml的workflow_dispatch来首次推送saas-worker-base:latest到 ACR。@xiaoxia 请 review 🙏
🗑️ 预览环境已清理
PR #1430 已关闭或合并,对应的预览环境已被清理。