Smail/docs/远程前端构建验收记录.md
smail c1dd533c80
Some checks are pending
Security Checks / security (push) Waiting to run
修复构建窗口异常恢复并完成远程前端生产构建验收
2026-09-18 01:37:29 +08:00

64 lines
6.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 远程前端构建验收记录
## 范围与结论
本轮时间为 47 服务器上的 2026 年 9 月 18 日 01:24 至 01:36,时区为 Asia/Shanghai。应用回归、维护窗口及前端生产构建均在 `47.108.78.12` 执行,本机仅编辑、Git、证据下载与静态摘要检查。
- [✓] 复查上一轮维护窗口恢复:MySQL 返回 `mysqld is alive`,Smail 与 Scert 的可信 HTTPS 页面均返回 200,四项服务正常。
- [✓] 修复停止构建单元超时会跳过服务恢复的问题;远程隔离回归 11 项通过。
- [✓] 使用新安装的锁定依赖重跑前端回归:24 个文件、185 项通过,零失败、零跳过。
- [✓] 在用户授权的维护窗口内完成生产前端构建,生成新产物并核对嵌入目录内容完全一致。
- [✓] 恢复 MySQL 和 Scert 后验证数据库就绪与两个站点真实 HTTPS 页面;Smail、Nginx 主进程未变。
- [x] 新前端产物已归档并下载,等待构建完整 Linux 候选与后续业务验收。
- [!] 尚未替换线上应用,不构成首次安装、浏览器业务或整体验收通过。
本轮没有清理数据库、删除文件、修改正式证书、替换自动续期任务或停止 Nginx。没有进行业务数据测试,因此不将本轮描述为空库首次安装验收。
## 恢复工具整改
修改 `test/tools/build_frontend_review.py` 与 `test/deployment/test_frontend_build.py`。基线提交为 `4f5b05e`,已推送项目的 `smail` 远程;仓库没有 `origin` 远程,最初对此名称的推送失败后改用实际远程成功。
停止构建失败时先区分预检拒绝导致的单元不存在;其他异常记录为失败,并尝试终止该构建单元的残留进程。无论停止和终止操作是否超时,仍依次尝试恢复 MySQL、Scert,不再提前跳过恢复。单元名称限定为本工具生成的构建单元,不能传入业务服务名。父单元停止预算增加到 480 秒,以覆盖恢复路径的命令超时;保留 `finally` 与 systemd `ExecStopPost` 两层恢复。
构建硬上限从 960 MiB 调整为 896 MiB,Node 堆上限从 768 MiB 调整为 640 MiB;系统保留预算仍为 128 MiB。预检要求暂停服务后至少 1024 MiB 可用内存,失败则拒绝构建并恢复服务。此调整针对构建工作进程,不降低业务服务预算或密码计算参数。
远程控制目录为 `/var/tmp/smail-review-build-control-20260918-v2`,目录为 root 所有、0750,工具为 0640,smail 用户不可修改控制脚本。测试单元 `smail-build-control-tests-20260918-v2` 在非 root、独立网络及生产目录不可访问的环境中运行,真实服务调用均被模拟。11 项回归覆盖预算边界、停止超时、强制终止失败、数据库恢复失败、站点恢复超时、不存在的构建单元和非法服务名称,均通过;峰值 14.9 MiB,交换空间为零。证据为该目录的 `tests.txt`。
这些模拟回归不等同于真实故障期间服务恢复的完整演练,本轮真实窗口验证的是正常构建成功后的自动恢复。
## 前端回归与构建
工作目录为 `/var/tmp/smail-review-public-port-20260918`。完整依赖此前已使用 Yarn 1.22.22、项目 `yarn.lock`、冻结锁文件及禁用安装脚本方式安装;本次不再借用旧的测试专用依赖。
前端测试单元为 `smail-frontend-tests-20260918-013007`,结果目录为 `results-20260918-013008`。24 个文件、185 项通过,零失败、零跳过;运行 37.775 秒,峰值内存 99.3 MiB,交换空间为零。
维护窗口为 `smail-build-window-20260918-013126`,子构建为 `smail-frontend-build-20260918-013126`。窗口记录从 01:31:26 到 01:32:07,约 41 秒;Scert 和 MySQL 在窗口内临时停止,Smail 和 Nginx 未停止。暂停后可用内存为 1,091,984 KiB,通过原 128 MiB 保留预算检查。
Vite 生产构建成功,前端产物与 Go 嵌入目录各约 3.5 MiB,递归比较无差异。Vite 用时 37.20 秒,子单元用时 38.410 秒,峰值内存 758.5 MiB,交换空间为零。成功的临时单元已被 systemd 回收,因此 JSON 中后续查询的 `MemoryPeak` 为未设置;峰值取自同一构建日志中 systemd 的结束统计,不能把未设置当作零用量。
保留日志中的大于 500 kB 分块警告,未通过提高警告阈值隐藏它。该警告不阻止构建,但浏览器加载性能仍需验收。此前失败的 384 MiB Node 堆构建日志、被资源预检拒绝的窗口记录及旧工具均保留,没有删除或冒充成功结果。
## 恢复与证据
恢复后 MySQL PID 为 `589785`,Scert PID 为 `589832`;Smail PID `574584`、Nginx PID `578671` 前后一致,四项服务均正常,重启计数为零。01:33 收尾检查中 `mail.solit.cn` 和 `web.apmmk.cn` 的 HTTPS 页面均为 200,MySQL 就绪。该窗口之后的内核日志未发现 OOM 记录;没有连续请求采样,不能扩大为全窗口零请求失败或生产容量保证。
主工作目录内证据如下:
- `build-window-20260918-013126.json`:前后服务状态、构建退出码、预算与恢复结果。
- `frontend-build-20260918-013126.txt`:完整构建输出及资源统计。
- `build-closeout-0133.txt`:真实页面、数据库就绪、服务状态和产物比较。
- `frontend-source-0134.sha256`:154 个前端源码文件、3 个构建配置文件和同步工具摘要。
- `frontend-production-013126.tar.gz`:本轮新前端产物,权限 0600。
本机下载目录为 `out/public-port-build-20260918`,已确认由 Git 忽略规则排除。157 个源码及配置文件的原始 SHA-256 与本地一致;同步工具 `deploy/prepare-frontend.mjs` 因 CRLF/LF 差异原始摘要不同,下载远端原文后经 Git 比较及 16 行逐行比较均无内容差异。没有修改中文字符或替换源文件。
产物归档 SHA-256 为 `91f775c666e01a24e47b7ac35132ac171a087aac9641c5bffb3456113d311f01`,远程与下载文件一致;首页摘要为 `15703150ff67244c045bc5e83128412782f5ffcb1fa243ec9c046f8bbda97e58`。
## 后续门槛
- [ ] 使用本轮前端产物及新编译的 Linux 插件、应用、管理工具组成完整候选;不得直接使用偏 Windows 的开发构建脚本生成 Linux 发布包。
- [ ] 在远程隔离空库完成最新候选首次安装、内部 25 收信与附件验证,并扩展到实际 8001/8002 和 Nginx 反代结构。
- [ ] 进行可信 HTTPS 桌面浏览器业务、管理员恢复撤销、凭据轮换、队列故障及异机恢复验收。
- [!] Smail 专用 DNS 配置仍不存在;01:24 复核旧续期定时器 active,尚不能声称无停机自动续期已启用。
- [!] 公网端口和可信代理候选虽已有回归,仍未部署到线上应用。整体生产放行维持未通过。