# 头程单仓多服务构建部署说明 ## 一、适用范围 当前 `baiyue-firstleg` 是一个 Git 仓库,包含 11 个可独立运行的服务和 7 个公共模块。部署时无需拆成多个仓库,Jenkins 使用 Maven `-pl ... -am` 只构建目标服务及其依赖,并为每个服务生成独立 Docker 镜像。 MySQL、Redis、Nacos 是外部基础设施,不包含在业务 Compose 文件中。各业务库仍使用独立数据库,往来单位数据继续归属 `baiyue_warehouse`。 ## 二、文件说明 | 文件 | 用途 | | --- | --- | | `Jenkinsfile` | 自动识别变更、测试、打包、构建镜像、推送和部署 | | `deploy/docker/Dockerfile` | 11 个服务共用的 Java 17 非 root 镜像模板 | | `deploy/maven/settings-cn.xml` | Jenkins 构建使用的阿里云 Maven 公共仓库配置 | | `deploy/service-map.yml` | 模块、JAR 和端口的唯一映射清单 | | `deploy/docker-compose.yml` | 11 个业务服务的统一编排文件 | | `deploy/env/.env.test.example` | 测试环境变量模板,不含真实密码 | | `deploy/scripts/deploy-services.sh` | Jenkins 节点上的增量部署脚本 | 测试环境服务器准备步骤详见 `docs/test-environment-deployment.md`。 ## 三、Jenkins 前置条件 Jenkins 新建“多分支流水线”或“流水线”,脚本路径填写 `Jenkinsfile`。执行节点标签为 `docker-java17`,节点需要安装: - JDK 17 - Maven 3.8.8 以上 - Docker Engine - Docker Compose V2 - Git Jenkins 执行用户必须有运行 Docker 的权限。部署脚本当前在 Jenkins 节点执行,因此该节点应位于目标服务器,或将同一标签绑定到对应环境的部署节点。 ## 四、必须创建的 Jenkins 凭据 | Credentials ID | 类型 | 内容 | | --- | --- | --- | | `gitea-test-token` | Username with password | Gitea 用户名和访问令牌,令牌需要代码读取及容器包读写权限 | | `firstleg-test-env` | Secret file | 根据 `.env.test.example` 创建的测试环境 `.env` | | `firstleg-staging-env` | Secret file | 预发布环境 `.env`,使用预发布基础设施地址和密钥 | | `firstleg-production-env` | Secret file | 生产环境 `.env`,使用生产基础设施地址和密钥 | GitLab 仓库拉取如果不是由 Jenkins GitLab 集成统一授权,还需单独创建只读仓库凭据。任何 MySQL、Redis、Nacos、JWT 和第三方平台密钥都不得直接填写在 Jenkinsfile 或提交到 Git。 ## 五、流水线参数 | 参数 | 推荐值 | 说明 | | --- | --- | --- | | `BUILD_MODE` | `AUTO` | 自动分析上次成功构建之后的 Git 变更 | | `SERVICE_*` 复选框 | 按需 | `SELECT` 时勾选一个或多个服务,如订单和仓库 | | `ENVIRONMENT` | `test` | 可选 `test`、`staging`、`production` | | `DEPLOY` | 测试环境勾选 | 是否在镜像推送后执行部署 | | `SKIP_TESTS` | 不勾选 | 临时调试才跳过测试 | | `IMAGE_REPOSITORY` | Gitea 容器镜像地址 | 当前测试环境为 `8.163.30.128:10082/java-project/baiyue-firstleg` | | `DOCKER_BASE_IMAGE` | 保持默认 | 默认通过国内镜像代理拉取 Java 17 运行时,也可替换为企业内部镜像地址 | 公共模块、根 POM 或 Dockerfile 变化会构建全部 11 个服务。仅 `order/**` 变化时执行: ```bash mvn -pl order -am clean package ``` `order` 与 `warehouse` 同时变化时只调用一次 Maven: ```bash mvn -pl order,warehouse -am clean package ``` 这样可避免多个并发 Maven 任务同时改写公共模块的 `target` 目录。 ## 六、镜像与部署规则 每个镜像使用 Git 提交短 SHA 作为不可变标签,例如: ```text gitlab.example.com/logistics/baiyue-firstleg/order:a1b2c3d4e5f6 ``` 测试和预发布环境勾选 `DEPLOY` 后自动部署。生产环境会额外出现人工确认,确认内容包含服务列表和镜像标签。增量部署会自动带上 `gateway`,保证网关配置与业务服务保持可用;不会重启未选择的其他业务服务。 首次部署建议使用 `BUILD_MODE=ALL`。基础设施必须先可用,并已创建以下数据库:`baiyue_auth`、`baiyue_iam`、`baiyue_firstleg`、`baiyue_order`、`baiyue_warehouse`、`baiyue_file`、`baiyue_print`、`baiyue_event_bridge`、`baiyue_audit`。 ## 七、GitLab CI 与 Jenkins 职责 现有 `.gitlab-ci.yml` 仍执行全量校验和打包,适合合并请求质量检查;Jenkins 负责镜像构建与部署。正式启用 Jenkins 后,建议把 GitLab CI 的“打包服务”任务限制为合并请求或删除,避免一次提交重复进行两次完整打包。 ## 八、回滚 回滚不重新编译代码。在 Jenkins 用 `SELECT` 选中服务,将部署环境 `.env` 中的镜像标签临时改为已验证的历史 SHA,或在服务器执行同一 Compose 文件指定历史 `IMAGE_TAG` 后 `up -d`。生产回滚仍应保留人工确认和操作记录。