4.2 KiB
4.2 KiB
Jenkinsfile 单体部署 nl-server 设计
- 日期:2026-07-16
- 分支:feature/20260713/task-module
- 状态:已评审通过(Docker 容器 + 构建机=运行机 + 参数化多环境)
1. 背景与目标
项目当前无任何 CI/CD 流水线。目标:在仓库根目录新增 Jenkinsfile,把 nl-server(单体聚合模块,内含 system/infra/lms/task 四个 server 模块)以 Docker 容器形式部署到 Jenkins 构建机本机,先跑通单服务单机部署。
2. 已确认的环境事实与决策
| 项 | 结论 |
|---|---|
| 部署形态 | Docker 容器(复用现有 nl-server/Dockerfile:temurin 21-jre、EXPOSE 48080、支持 JAVA_OPTS/ARGS 环境变量) |
| 构建机与运行机 | 同一台机器(Jenkins agent 本机 docker run) |
| Spring profile | 参数化(test/dev/prod,默认 test) |
| 构建产物 | mvn package 后 nl-server/target/nl-server.jar(pom finalName=nl-server,spring-boot repackage) |
| 前提 | 构建机已装 JDK 17+、Maven、Docker,Jenkins 任务类型为 Pipeline from SCM |
| 测试 | 构建跳过测试(-DskipTests,项目约定) |
3. Jenkinsfile 设计(声明式 Pipeline)
3.1 参数(parameters)
| 参数 | 类型 | 默认值 | 用途 |
|---|---|---|---|
PROFILE |
choice(test/dev/prod) | test | 注入 SPRING_PROFILES_ACTIVE |
NACOS_ADDR |
string | 127.0.0.1:8848 |
注入 SPRING_CLOUD_NACOS_CONFIG_SERVER_ADDR 与 SPRING_CLOUD_NACOS_SERVER_ADDR(沿用现有 docker-compose 变量名风格) |
NACOS_NAMESPACE |
string | 空 | 注入 SPRING_CLOUD_NACOS_CONFIG_NAMESPACE 与 SPRING_CLOUD_NACOS_DISCOVERY_NAMESPACE |
JAVA_OPTS |
string | -Xms512m -Xmx512m -Djava.security.egd=file:/dev/./urandom |
覆盖 Dockerfile 内默认 JVM 参数(默认值与 Dockerfile 保持一致,避免参数化后丢失 egd 配置) |
3.2 环境变量(environment)
IMAGE_NAME = 'nl-server'CONTAINER_NAME = 'nl-server'APP_PORT = '48080'
3.3 Stages
- Checkout:
checkout scm。 - Maven Build:
mvn clean package -pl nl-server -am -DskipTests(只构建 nl-server 及依赖模块)。 - Docker Build:
docker build -t nl-server:${BUILD_NUMBER} -t nl-server:latest nl-server/(构建上下文为 nl-server 目录,DockerfileCOPY ./target/nl-server.jar)。 - Deploy:
docker stop/docker rm旧容器(|| true容错首次部署);docker run -d --name nl-server --restart always --network host,挂载日志卷-v /docker/nl-cloud/logs:/root/logs/(与现有 compose 一致),注入TZ=Asia/Shanghai、SPRING_PROFILES_ACTIVE、Nacos 四个变量、JAVA_OPTS,镜像用nl-server:${BUILD_NUMBER}。 - Health Check:shell 循环最多 24 次、每次间隔 5s(约 120s)探测
http://127.0.0.1:48080,收到任意 HTTP 响应即通过;超时则docker logs --tail 200输出容器日志并使构建失败。
3.4 post 处理
success:输出部署成功信息(镜像 tag、访问地址)。failure:输出失败提示。always:docker image prune -f仅清理悬空镜像(历史nl-server:<BUILD_NUMBER>tag 保留,用于手动回滚)。
3.5 网络模式说明
使用 --network host:与项目现有 script/docker/docker-compose.yml 一致;Nacos 在同机部署时容器内可直接访问 127.0.0.1:8848,无需端口映射(端口由应用自身监听 48080)。
4. 错误处理
- 任一 stage 命令非零退出即中止流水线(声明式默认行为)。
- 停删旧容器
|| true,首次部署无旧容器不报错。 - 健康检查失败:输出容器日志后
exit 1,构建标红;旧镜像 tag 仍在本机,可手动回滚。
5. 验证
- 本地无 Jenkins 环境,静态验证为主:Jenkinsfile 为 Groovy 声明式语法,检查括号/引号配对与 stage 结构;shell 片段用
bash -n无法直接验证(内嵌),人工核对。 - 真实验证需在 Jenkins 上建 Pipeline 任务指向仓库运行(由用户执行)。
6. 范围外(明确不做)
- 微服务逐个部署(gateway/system/infra/task 独立容器)。
- 推送镜像仓库、SSH 远程部署、多机部署。
- 前端 nl-ui 的构建部署。
- 自动回滚、通知(钉钉等)。