nginx

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > nginx > Jenkins发布后页面404

Jenkins发布后Nginx页面404与构建OOM解决方案

作者:陈陈小白

Jenkins是持续集成领域的核心开源自动化服务器,其本质是构建在Java运行时之上的可扩展任务调度与流水线执行引擎,这篇文章主要介绍了Jenkins发布后Nginx页面404与构建OOM解决方案的相关资料,需要的朋友可以参考下

一、问题描述

1.1 现象

1.2 环境与前提

二、排查过程

2.1 配置与代码对比

对比项结论
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;两分支的差异主要在业务代码(尤其是新增分包)。

2.2 Jenkins 构建日志对比

初步怀疑:Docker 层缓存可能导致异常分支镜像使用了“错误历史”的构建产物。
措施:在异常分支流水线中为 docker build 增加 --no-cache。
结果:加 --no-cache 后 404 现象依旧,说明问题不在“误用旧缓存”,而在本次构建产物本身。

2.3 访问路径与 404 类型确认

结论:问题在 nginx 找不到要响应的资源(缺文件或路径不对),需从镜像内文件和 nginx 配置入手。

2.4 构建产物验收(Dockerfile 内 ls)

在 Dockerfile 的 RUN yarn build:${BUILD_ENV} 后增加“验收”命令,在 Jenkins 构建日志中查看 H5 构建输出目录(如 dist/build/h5/)实际内容:

RUN yarn build:${BUILD_ENV} && \
    echo "==== dist/build/h5 结构 ====" && \
    ls -la /app/dist/build/h5/ && \
    ...

Jenkins 日志结果(举例):

结论:构建并未完整完成,镜像里缺少 H5 入口和静态资源,nginx 自然 404。

2.5 构建过程 OOM 与“假成功”

同一段 Jenkins 构建日志中可见:

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 导致产物不完整,又因子进程退出码未正确传递而出现“构建成功但镜像缺文件”的假成功。

2.6 为何正常分支正常、异常分支异常

三、根因总结

维度根因
直接原因镜像内缺少入口 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。

四、解决方案

4.1 修改内容(Dockerfile)

在项目 Dockerfile 的构建阶段做两处修改:

1. 提高 Node 堆内存上限,避免 OOM

在 RUN yarn build:${BUILD_ENV} 之前增加(数值可按项目规模调整,如 8192 表示 8GB):

ENV NODE_OPTIONS=--max-old-space-size=8192

使 Node 最多使用 8GB 堆内存,满足含新增分包的构建需求。

2. 构建产物校验,避免推送不完整镜像

在构建命令后增加对 H5 入口文件(如 index.html)的检查,若不存在则令本层失败(路径需与项目实际输出一致,如 dist/build/h5/):

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 构建会失败,不会再把缺页面的镜像推出去。

4.2 Dockerfile 片段(构建阶段)举例

# 构建项目(支持通过 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 等请按项目实际 应用路径 和 构建输出目录 替换。)

4.3 若仍 OOM 可进一步

五、验证与后续建议

5.1 验证步骤

  1. 提交并推送上述 Dockerfile 修改,使用 异常分支(如 test、feature-xxx)触发 Jenkins 构建。
  2. 查看构建日志:
    • 若构建成功,应能看到 ==== dist/build/h5 结构 ==== 下列出 index.html 和 assets/。
    • 若仍 OOM,会先出现 FATAL ERROR: ... heap out of memory,随后 test -f ... index.html 失败,构建失败,不会推送镜像。
  3. 对成功构建的镜像进行部署,再次访问 实际访问地址(如 https://<UAT 域名>/<应用路径>/package-community/pages/pgc?id=xxx),确认页面正常、无 nginx 404。

5.2 后续建议

六、时间线与关键结论速查

阶段结论
配置对比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 校验

到此这篇关于Jenkins发布后Nginx页面404与构建OOM解决方案的文章就介绍到这了,更多相关Jenkins发布后页面404内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文