| 对比项 | 结论 |
|---|---|
| vite.config.js(含 base,如 base: '/mini-app-h5/') | 两分支一致 |
| src/manifest.json(h5.router.base) | 两分支一致 |
| public/nginx/default.conf(try_files ... /<应用路径>/index.html) | 两分支一致 |
| package.json、yarn.lock | 两分支一致 |
| src/pages.json | 异常分支多出新增子包配置 |
| src/ 其他差异 | 异常分支多出新增分包目录(如 package-service/**)、部分 API/组件/样式等 |
结论:路由 base、nginx 配置、依赖一致,不是配置错误导致的 404;两分支的差异主要在业务代码(尤其是新增分包)。
初步怀疑:Docker 层缓存可能导致异常分支镜像使用了“错误历史”的构建产物。
措施:在异常分支流水线中为 docker build 增加 --no-cache。
结果:加 --no-cache 后 404 现象依旧,说明问题不在“误用旧缓存”,而在本次构建产物本身。
结论:问题在 nginx 找不到要响应的资源(缺文件或路径不对),需从镜像内文件和 nginx 配置入手。
在 Dockerfile 的 RUN yarn build:${BUILD_ENV} 后增加“验收”命令,在 Jenkins 构建日志中查看 H5 构建输出目录(如 dist/build/h5/)实际内容:
|
1 2 3 4 |
RUN yarn build:${BUILD_ENV} && \ echo "==== dist/build/h5 结构 ====" && \ ls -la /app/dist/build/h5/ && \ ... |
Jenkins 日志结果(举例):
结论:构建并未完整完成,镜像里缺少 H5 入口和静态资源,nginx 自然 404。
同一段 Jenkins 构建日志中可见:
|
1 |
FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory |
说明 yarn build:dev(或 yarn build:prod)在 Docker 内执行时发生了 Node 堆内存不足(OOM),构建进程崩溃,未生成完整 index.html 和 assets/。
但该次 Jenkins 构建仍然显示 “构建成功”,原因在于:
结论:异常分支因构建时 OOM 导致产物不完整,又因子进程退出码未正确传递而出现“构建成功但镜像缺文件”的假成功。
| 维度 | 根因 |
|---|---|
| 直接原因 | 镜像内缺少入口 HTML(如 /usr/share/nginx/html/<应用路径>/index.html)及 assets,nginx 对应用路径的请求走 try_files 后找不到文件,返回 404。 |
| 构建层原因 | 异常分支在 Jenkins Docker 构建时,yarn build:xxx 因 Node 堆内存不足(OOM) 崩溃,未生成完整 H5 产物。 |
| 为何“构建成功” | OOM 发生在子进程,退出码未正确传回 yarn,yarn 仍返回 0,Docker 认为 RUN 成功,推送了不完整镜像。 |
| 为何仅异常分支出问题 | 异常分支新增分包等代码,构建内存需求高于正常分支,在相同构建环境下更容易 OOM。 |
在项目 Dockerfile 的构建阶段做两处修改:
1. 提高 Node 堆内存上限,避免 OOM
在 RUN yarn build:${BUILD_ENV} 之前增加(数值可按项目规模调整,如 8192 表示 8GB):
|
1 |
ENV NODE_OPTIONS=--max-old-space-size=8192 |
使 Node 最多使用 8GB 堆内存,满足含新增分包的构建需求。
2. 构建产物校验,避免推送不完整镜像
在构建命令后增加对 H5 入口文件(如 index.html)的检查,若不存在则令本层失败(路径需与项目实际输出一致,如 dist/build/h5/):
|
1 2 3 4 5 |
RUN yarn build:${BUILD_ENV} && \ echo "==== dist/build/h5 结构 ====" && \ ls -la /app/dist/build/h5/ && \ (ls -la /app/dist/build/h5/<应用路径>/ 2>/dev/null || echo "无子目录") && \ test -f /app/dist/build/h5/index.html || (echo "Build failed: index.html not found (possible OOM)" && exit 1) |
这样一旦 OOM 导致未生成 index.html,Docker 构建会失败,不会再把缺页面的镜像推出去。
|
1 2 3 4 5 6 7 8 9 |
# 构建项目(支持通过 ARG 传递构建环境) # 提高 Node 堆内存上限,避免 Jenkins 构建时 OOM(分包较多的分支) ARG BUILD_ENV=prod ENV NODE_OPTIONS=--max-old-space-size=8192 RUN yarn build:${BUILD_ENV} && \ echo "==== dist/build/h5 结构 ====" && \ ls -la /app/dist/build/h5/ && \ (ls -la /app/dist/build/h5/mini-app-h5/ 2>/dev/null || echo "无 mini-app-h5 子目录") && \ test -f /app/dist/build/h5/index.html || (echo "Build failed: index.html not found (possible OOM)" && exit 1) |
(上述 mini-app-h5、dist/build/h5 等请按项目实际 应用路径 和 构建输出目录 替换。)
| 阶段 | 结论 |
|---|---|
| 配置对比 | vite/manifest/nginx 一致,非配置错误 |
| Jenkins 日志 | 正常分支与异常分支、commit 不同;加 --no-cache 仍 404 |
| 404 类型 | nginx 直接返回 404,属服务端 404 |
| 验收构建产物 | 构建输出目录无 index.html、无 assets/,且无预期子目录 |
| 构建日志 | 出现 JavaScript heap out of memory,构建子进程 OOM |
| 假成功原因 | 子进程 OOM 退出码未传回 yarn,RUN 仍为 0,镜像被推送 |
| 根因 | 异常分支新增分包导致构建内存不足 OOM,产物不完整 |
| 解决 | NODE_OPTIONS=–max-old-space-size=8192 + test -f index.html 校验 |