fix: 统一前端Harbor镜像发布与拉取部署

This commit is contained in:
Yvan
2026-11-05 13:08:56 +08:00
parent 5f6e893457
commit af2a2a44b3
13 changed files with 201 additions and 61 deletions
+30 -11
View File
@@ -34,52 +34,70 @@ pnpm package:test --tag web-20261105-01
`--skip-install` 可在已经按锁文件安装依赖后使用;`--output <目录>` 可指定包输出目录。在 `sw-new/web` 中开发时也可运行:检查只覆盖前端,后端本地配置不影响打包。若已在本地生成分仓提交,可传 `--source-ref codex/publish-web`,脚本会验证该提交的根目录与当前前端源码树一致。
## 3. 从前端源码构建 Docker 镜像
## 3. 构建并推送 Harbor 镜像
```sh
pnpm build:docker
pnpm build:docker --tag web-20261105-01
# 构建后推送到 Harbor
docker login harbor.fuhua91.com
pnpm push:docker --tag web-20261105-01
```
生成 `sw2/frontend:<版本>`。`deploy/Dockerfile` 使用多阶段构建,在 Node 容器安装依赖并构建,再将产物放入 Nginx 镜像。`deploy/runtime.Dockerfile` 用于上面的发布包,服务器无需安装 Node。
镜像仓库统一为 **`harbor.fuhua91.com/game/sw2:<版本>`**,默认版本仍为源码提交号前 12 位。`build:docker` 只构建,`push:docker` 构建并推送到 Harbor 的 `game/sw2` 仓库。使用已有 Docker 登录凭据或机器人账号,本机推送账号需要 `game/sw2` 的 push 权限,服务器拉取账号需要 pull 权限;密码不写入脚本或发布包。
仓库根目录原有 `Dockerfile` 仍供 Kubernetes/Jenkins 使用,继续读取 `nginx.k8s.conf`;独立测试服发布使用 `deploy/` 下的 Dockerfile。
`deploy/Dockerfile` 在 Node 容器内完成源码构建,`deploy/runtime.Dockerfile` 用于发布包的服务器构建。根目录 `Dockerfile` 与 Windows `pnpm pack:docker <版本>` 入口也使用上述 Harbor 仓库;`pack:docker` 构建并推送,传 `-SaveArchive` 可额外导出离线镜像到忽略的 `.cache/docker/`。
本机构建检测到 Buildx 时,输出 Linux amd64 的单平台 Docker 镜像并关闭默认证明附件,兼容测试服 Docker 18.06;没有 Buildx 时使用传统构建器。
## 4. 发布到 sw2 测试服
默认连接 `root@192.168.2.226:22`,部署根目录 `/www/wwwroot/sw2.fuhua91.com`。使用本机 SSH 密钥或 SSH agent;首次使用先用 `ssh root@192.168.2.226` 确认主机指纹和登录权限。脚本使用非交互 SSH,仓库不保存密码。
```sh
# 构建、上传、校验 SHA-256 并发布
# 本机打包,服务器构建并推送 Harbor,再拉取部署
pnpm deploy:test
# 已通过 push:docker 推送:测试服直接从 Harbor 拉取,不再上传包或重新构建
pnpm deploy:test --image-tag web-20261105-01
# 复用已经生成的包
pnpm deploy:test --archive .cache/deploy/sw2-frontend-web-20261105-01.tar.gz
# 先在服务器构建镜像、验证页面版本和 /api/health,保持当前容器运行
# 构建、推送、拉取并预检,保持当前容器运行
pnpm deploy:test --archive .cache/deploy/sw2-frontend-web-20261105-01.tar.gz --build-only
# 也可仅预检 Harbor 中的现有镜像
pnpm deploy:test --image-tag web-20261105-01 --build-only
# 使用其他 SSH 账号、端口或密钥
pnpm deploy:test --archive <发布包.tar.gz> --user deploy --port 22 --identity <私钥路径>
```
可用 `--host` 与 `--directory` 覆盖测试服务器和部署根目录。服务器账号需要该目录写权限及 Docker 权限。现有的 `sw2-net` 网络、`sw2-backend:8000` 服务与宝塔反向代理应已就绪;脚本兼容测试服 Docker 18.06,不依赖 Docker Compose。
可用 `--host` 与 `--directory` 覆盖测试服务器和部署根目录。服务器账号需要该目录写权限及 Docker 权限,并已执行 `docker login harbor.fuhua91.com`。发布包模式在服务器执行 push,需 push/pull 权限;`--image-tag` 模式只需 pull 权限。现有的 `sw2-net` 网络、`sw2-backend:8000` 服务与宝塔反向代理应已就绪;服务端脚本兼容 Docker 18.06,不依赖 Docker Compose。
若服务器已有其他项目的 Docker 登录,可为本项目前端单独配置。脚本优先读取部署根目录 `harbor-docker/config.json`,不存在时使用当前账号默认 Docker 配置:
```sh
install -d -m 700 /www/wwwroot/sw2.fuhua91.com/harbor-docker
docker --config /www/wwwroot/sw2.fuhua91.com/harbor-docker login harbor.fuhua91.com
chmod 600 /www/wwwroot/sw2.fuhua91.com/harbor-docker/config.json
```
发布过程:
1. 验证包结构和版本,上传至 `frontend-releases/`,校验 SHA-256。相同版本只接受同一个发布包。
2. 构建镜像,运行临时前端容器,检查 `/healthz`、`/version.txt` 和 `/api/health`。
2. 发布包模式先构建并推送 `harbor.fuhua91.com/game/sw2:<版本>`;两种模式随后都从 Harbor 拉取,取得镜像摘要,按 `harbor.fuhua91.com/game/sw2@sha256:…` 运行临时容器并检查 `/healthz`、`/version.txt` 和 `/api/health`。镜像推送或拉取失败时,当前容器继续运行。
3. 预检通过后,只替换 `sw2-frontend`,仍绑定 `127.0.0.1:9601`。上一版保留为停止状态的 `sw2-frontend-previous`。
4. 再次检查新容器;失败自动恢复上一版。成功后写入 `current-frontend-release`,后端容器、数据库、后端配置及联合发布的 `current-release` 均不修改。
4. 正式容器使用同一个已验证的镜像摘要;再次检查失败时自动恢复上一版。成功后写入 `current-frontend-release`,镜像摘要保存在 `frontend-images/<版本>.ref`。后端容器、数据库、后端配置及联合发布的 `current-release` 均不修改。
Nginx 使用 Docker DNS 动态解析后端地址,后端独立重建后无需重建前端镜像。对外仍访问 `http://sw2.fuhua91.com`。
## 回退与验证
重新发布保留的旧前端包即可回退,仍只操作前端:
指定 Harbor 中保留的旧版本即可回退,仍只操作前端:
```sh
pnpm deploy:test --archive .cache/deploy/sw2-frontend-<旧版本>.tar.gz
pnpm deploy:test --image-tag <旧版本>
```
服务端手工执行同样的脚本:
@@ -88,9 +106,10 @@ pnpm deploy:test --archive .cache/deploy/sw2-frontend-<旧版本>.tar.gz
bash /www/wwwroot/sw2.fuhua91.com/frontend-releases/<版本>/deploy.sh <版本>
curl -fsS http://127.0.0.1:9601/version.txt
curl -fsS http://127.0.0.1:9601/api/health
docker inspect --format '{{.Config.Image}}' sw2-frontend
```
发布脚本通过文件锁阻止并发前端发布。永久回归测试覆盖包路径与版本验证、预检失败、发布后失败回退、只构建模式,以及后端容器保持不变:
发布脚本通过文件锁阻止并发前端发布。永久回归测试覆盖包路径与版本验证、Harbor 推送/拉取失败、缺失镜像摘要、直接拉取模式、预检失败及发布后回退,以及后端容器保持不变:
```sh
pnpm test:release