Files
docs/测试环境Jenkins部署指南.md
T
2026-08-08 21:14:43 +08:00

168 lines
9.3 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.
# 测试环境 Jenkins 部署指南
> 最后核对:2026-08-08
>
> 本文供 Codex 对话和项目维护人员部署虫虫出海测试环境使用。只适用于测试环境,不适用于预发布或生产。
## 1. 持续授权与执行边界
用户已明确授权:当前任务确实需要把已完成的变更部署到测试环境时,Codex 可以直接触发与变更范围对应的 Jenkins 测试 Job,不必再次等待“是否部署”的确认。
出现以下任一情况,可以直接部署:
- 用户明确要求部署、发布测试环境或验证测试环境。
- 当前任务的完成标准包含远端联调、测试环境回归或浏览器验收。
- 已修复测试环境问题,必须部署后才能验证修复结果。
此授权不包含以下操作;遇到时必须单独取得用户明确确认:
- 部署 `staging` 或 `production`。
- 勾选 `INITIALIZE_TEST_DATABASE`,或执行任何数据库写入、迁移、初始化和测试数据修改。
- 勾选 `SKIP_TESTS`。
- 无法明确影响范围时执行后端 `ALL` 全量部署。
- 修改 Jenkins Job、Credentials、节点、插件、权限或系统配置。
- 删除构建、停止他人正在执行的构建、回滚环境或清理容器/数据。
普通本地代码任务不因为存在 Jenkins 就自动部署。只有部署是用户要求或当前任务验收所必需时,才使用本授权。
## 2. 环境与认证
| 项目 | 地址或标识 |
|---|---|
| Jenkins | `http://8.163.30.128:14808/` |
| Jenkins 用户 | `admin` |
| 测试 Gateway | `http://8.163.30.128:9000` |
| Admin Web | `http://8.163.30.128:9001` |
| Client Web | `http://8.163.30.128:9002` |
| 后端 Git 分支 | `test` |
| Admin/Client Git 分支 | `release/test` |
本文不保存 Jenkins 密码、API Token 或 Cookie。优先复用已登录的受控浏览器会话;没有登录会话时,从用户明确提供的安全来源获取凭据。不得把凭据写入仓库、命令行历史、脚本、日志或交付说明。
Jenkins 页面会显示“系统管理”“新建任务”“配置”“删除 Pipeline”等管理入口。即使当前账号具有管理权限,也只能执行本任务所需的构建和只读检查。
## 3. Job 与部署单元
| 部署单元 | Jenkins Job | 源码目录 | 流水线行为 |
|---|---|---|---|
| Admin Web | `admin-web-test` | `apps/admin-web/` | 拉取 `release/test`,构建镜像,重建容器,执行容器内 `/healthz` |
| Client Web | `client-web-test` | `apps/client-web/` | 拉取 `release/test`,构建镜像,重建容器,执行容器内 `/healthz` |
| 后端总控 | `backend-java` | `baiyue-firstleg/` | 选择变更服务并行调度下游 Job;测试环境使用 Jenkins 节点本机镜像 |
后端下游 Job:
- `baiyue-firstleg-gateway`
- `baiyue-firstleg-auth`
- `baiyue-firstleg-iam`
- `baiyue-firstleg-firstleg`
- `baiyue-firstleg-order`
- `baiyue-firstleg-warehouse`
- `baiyue-firstleg-file`
- `baiyue-firstleg-print`
- `baiyue-firstleg-integration-service`
- `baiyue-firstleg-event-bridge-service`
- `baiyue-firstleg-audit-service`
正常部署后端时从 `backend-java` 总控 Job 发起。下游 Job 主要由总控调度;只有重跑同一提交的单个失败服务且已核对全部参数时,才直接操作下游 Job。
## 4. 部署前强制检查
1. 阅读目标项目及目标模块的 `AGENTS.md`,确认任务允许修改和部署该单元。
2. 检查工作区状态,区分当前任务变更与用户已有变更。不得擅自提交或部署无关改动。
3. 运行目标项目声明的测试和构建门禁:
- Admin:至少运行受影响测试、`pnpm typecheck` 和 `pnpm build`;交付部署前优先运行 `pnpm test`。
- Client:至少运行 `pnpm typecheck`、受影响测试和 `pnpm build`;交付部署前优先运行 `pnpm test`。
- Backend:优先运行 `mvn -pl <module> -am test`;公共模块或跨服务变更按影响范围扩大验证。
4. 确认待部署代码已经提交并推送到 Jenkins 实际拉取的远端分支。Jenkins 无法部署本地未提交或未推送的文件。
5. 记录准备部署的仓库、分支、完整 commit SHA、Job 和后端服务列表。
6. 在触发前通过 commentary 告知用户即将部署的 Job、commit 和范围。该通知不是等待确认;符合第 1 节授权时可继续执行。
7. 检查 Jenkins 构建队列和执行器。不得覆盖或中断他人构建;同一 Job 正在构建时等待其结束,再重新核对远端提交。
如果当前工作区包含其他人的未提交改动,只有在能够证明远端目标 commit 仅包含本任务变更时才可部署。无法隔离时停止并说明阻断。
## 5. 前端部署
Admin 和 Client Job 无部署参数,触发后会直接构建并重建对应测试容器。因此触发前必须确认远端 `release/test` HEAD 就是目标提交。
### Admin
1. 打开 `admin-web-test`。
2. 核对最近构建、当前队列和远端 `release/test` 目标提交。
3. 触发“立即构建”。
4. 等待构建进入终态,不得只看到进入队列就结束任务。
5. 成功后检查 `http://8.163.30.128:9001/healthz` 返回 HTTP 200 和 `ok`。
### Client
1. 打开 `client-web-test`。
2. 核对最近构建、当前队列和远端 `release/test` 目标提交。
3. 触发“立即构建”。
4. 等待构建进入终态。
5. 成功后检查 `http://8.163.30.128:9002/healthz` 返回 HTTP 200 和 `ok`。
前端 `/healthz` 只证明容器和 Nginx 正常。任务涉及登录、接口或业务页面时,还必须按当前任务执行对应 Gateway 请求或浏览器业务验收。
## 6. 后端部署
打开 `backend-java`,选择 “Build with Parameters”。测试环境常规部署使用以下参数:
| 参数 | 常规值 | 说明 |
|---|---|---|
| `BUILD_MODE` | `SELECT` 或已核对后的 `AUTO` | 优先显式选择受影响服务;确认提交差异完整时可用 `AUTO` |
| `SERVICE_*` | 仅勾选受影响服务 | `SELECT` 模式至少选择一个 |
| `ENVIRONMENT` | `test` | 本文禁止改为其他环境 |
| `DEPLOY` | `true` | 否则只构建镜像,不更新测试容器 |
| `INITIALIZE_TEST_DATABASE` | `false` | 修改数据库,未经单独确认不得开启 |
| `SKIP_TESTS` | `false` | 未经单独确认不得跳过测试 |
| `IMAGE_REPOSITORY` | 保持测试默认值 | `test` 会解析为 `baiyue-firstleg-test` |
| `DOCKER_BASE_IMAGE` | 保持 Job 默认值 | 除非任务明确要求变更基础镜像 |
| `DOWNSTREAM_JOB_PREFIX` | `baiyue-firstleg-` | 与现有 11 个下游 Job 对应 |
选择规则:
- 单服务业务代码:选择该服务,并检查内部客户端或契约消费者是否也需要部署。
- `common-*`、父 `pom.xml`、`platform-bom/`、`Jenkinsfile*` 或 `deploy/` 变化:`AUTO` 会选择全部 11 个服务;全量部署前仍需按第 1 节取得确认。
- Gateway 路由、CORS 或访问域变化:选择 `gateway`,并检查受影响业务服务。
- 跨服务 DTO/OpenAPI/内部客户端变化:同时选择生产者和消费者。
- 数据库结构变化:不能仅部署服务。先按数据库变更规则取得明确授权并完成迁移,再部署依赖该结构的服务。
- File 服务部署依赖 Jenkins 文件凭据 `firstleg-test-env` 中有效的 `ROCKETMQ_NAME_SERVER`,且 `MQ_TOPIC_PREFIX` 必须为 `test-`。
总控 Job 成功不应只看主任务颜色。必须核对描述或日志中的每个下游结果均为 `SUCCESS`。出现任一 `FAILURE` 时,总控可能显示 `UNSTABLE`;这种情况视为部署失败。
## 7. 部署后验证
每次部署至少完成以下检查:
1. Jenkins Job 已进入终态,记录构建号、结果、commit 和耗时。
2. 后端总控部署记录全部下游 Job 名称、构建号和结果。
3. 前端健康检查:
- `GET http://8.163.30.128:9001/healthz`
- `GET http://8.163.30.128:9002/healthz`
4. 后端入口检查:`GET http://8.163.30.128:9000/actuator/health` 返回 HTTP 200。
5. 执行与变更直接相关的真实 API 或浏览器流程。健康检查不能代替业务验收。
6. 失败响应记录 HTTP 状态、业务错误码、`requestId`、`traceId` 和阻断原因。
不得因为 Jenkins 成功就宣称业务验收通过,也不得让测试失败回退为模拟成功。
## 8. 失败处理
- 构建失败:读取失败阶段和控制台日志,定位第一个有效错误;修复并完成本地验证后,用新 commit 重新部署。
- 下游服务失败:记录失败的服务 Job 和构建号,检查 Maven 测试、镜像构建、环境凭据及 Docker Compose 输出。
- 部署成功但健康检查失败:检查对应 Job 的容器状态和末尾日志,不切换为本地后端。
- 健康检查成功但业务失败:记录请求证据,核对数据库迁移、Nacos 配置、服务注册和真实接口契约。
- 不得在未确认影响的情况下通过跳过测试、初始化数据库、清理工作区外数据或全量重启来“试一下”。
失败后不要自动回滚、删除容器或修改测试数据。需要这些动作时先向用户说明具体目标、影响和恢复方案并取得确认。
## 9. 交付记录
部署完成后,最终回复至少包含:
- 部署的环境、Job 和服务范围。
- 分支与 commit SHA。
- Jenkins 构建号及最终结果。
- 健康检查和直接业务验证结果。
- 任何失败、跳过项、残余风险及 `requestId`/`traceId`。
不要在回复中输出密码、Token、Cookie、Jenkins Credential 内容或环境文件内容。