Files
huachuang/docs/superpowers/plans/2026-07-16-jenkinsfile-monolith-deploy.md

171 lines
6.5 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.

# Jenkinsfile 单体部署 nl-server 实现计划
> **面向 AI 代理的工作者:** 必需子技能:使用 superpowers:subagent-driven-development推荐或 superpowers:executing-plans 逐任务实现此计划。步骤使用复选框(`- [ ]`)语法来跟踪进度。
**目标:** 在仓库根目录新增 `Jenkinsfile`,以 Docker 容器形式在 Jenkins 构建机本机部署 `nl-server` 单体。
**架构:** 声明式 Pipeline参数化PROFILE/NACOS_ADDR/NACOS_NAMESPACE/JAVA_OPTS→ Checkout → `mvn package -pl nl-server -am -DskipTests` → 复用 `nl-server/Dockerfile` 构建镜像BUILD_NUMBER + latest 双 tag→ 停删旧容器后 host 网络 `docker run` → curl 循环健康检查post 清理悬空镜像。
**技术栈:** Jenkins 声明式 PipelineGroovy/ Maven / DockerLinux 构建机)
**规格:** `docs/superpowers/specs/2026-07-16-jenkinsfile-monolith-deploy-design.md`
---
## 文件结构
| 文件 | 操作 | 职责 |
|---|---|---|
| `Jenkinsfile`(仓库根目录) | 创建 | 单体部署流水线全部逻辑 |
---
### 任务 1创建根目录 `Jenkinsfile`
**文件:**
- 创建:`Jenkinsfile`
- [ ] **步骤 1创建文件内容如下**
```groovy
// nl-server 单体部署流水线(构建机 = 运行机Linux + JDK17+ + Maven + Docker
pipeline {
agent any
parameters {
choice(name: 'PROFILE', choices: ['test', 'dev', 'prod'], description: '运行环境(注入 SPRING_PROFILES_ACTIVE')
string(name: 'NACOS_ADDR', defaultValue: '127.0.0.1:8848', description: 'Nacos 配置/注册中心地址')
string(name: 'NACOS_NAMESPACE', defaultValue: '', description: 'Nacos 命名空间public 留空)')
string(name: 'JAVA_OPTS', defaultValue: '-Xms512m -Xmx512m -Djava.security.egd=file:/dev/./urandom', description: 'JVM 启动参数')
}
environment {
IMAGE_NAME = 'nl-server'
CONTAINER_NAME = 'nl-server'
APP_PORT = '48080'
}
stages {
stage('Checkout') {
steps {
checkout scm
}
}
stage('Maven Build') {
steps {
// 只构建 nl-server 及其依赖模块,跳过测试
sh 'mvn clean package -pl nl-server -am -DskipTests'
}
}
stage('Docker Build') {
steps {
// 构建上下文为 nl-server 目录,复用其现有 Dockerfile
sh "docker build -t ${IMAGE_NAME}:${BUILD_NUMBER} -t ${IMAGE_NAME}:latest nl-server/"
}
}
stage('Deploy') {
steps {
// 停删旧容器首次部署无旧容器容错处理host 网络启动新容器
sh """
docker stop ${CONTAINER_NAME} || true
docker rm ${CONTAINER_NAME} || true
docker run -d --name ${CONTAINER_NAME} \\
--restart always \\
--network host \\
-v /docker/nl-cloud/logs:/root/logs/ \\
-e TZ=Asia/Shanghai \\
-e SPRING_PROFILES_ACTIVE=${params.PROFILE} \\
-e SPRING_CLOUD_NACOS_CONFIG_SERVER_ADDR=${params.NACOS_ADDR} \\
-e SPRING_CLOUD_NACOS_SERVER_ADDR=${params.NACOS_ADDR} \\
-e SPRING_CLOUD_NACOS_CONFIG_NAMESPACE=${params.NACOS_NAMESPACE} \\
-e SPRING_CLOUD_NACOS_DISCOVERY_NAMESPACE=${params.NACOS_NAMESPACE} \\
-e "JAVA_OPTS=${params.JAVA_OPTS}" \\
${IMAGE_NAME}:${BUILD_NUMBER}
"""
}
}
stage('Health Check') {
steps {
// 最多等待 24 次 x 5s ≈ 120s收到任意 HTTP 响应(含 404即视为启动成功
sh """
echo "等待 nl-server 启动..."
for i in \$(seq 1 24); do
if curl -s -o /dev/null http://127.0.0.1:${APP_PORT}; then
echo "nl-server 启动成功"
exit 0
fi
sleep 5
done
echo "健康检查超时,输出容器日志:"
docker logs --tail 200 ${CONTAINER_NAME}
exit 1
"""
}
}
}
post {
success {
echo "部署成功:${IMAGE_NAME}:${BUILD_NUMBER},服务端口 ${APP_PORT}(历史镜像 tag 保留,可用于手动回滚)"
}
failure {
echo '部署失败,请检查上方日志'
}
always {
// 仅清理悬空镜像,保留历史 BUILD_NUMBER tag
sh 'docker image prune -f || true'
}
}
}
```
---
### 任务 2静态验证
本地无 Jenkins/Groovy 环境,做结构性静态检查:
- [ ] **步骤 1花括号配对计数**
运行(仓库根目录):
```bash
grep -o '{' Jenkinsfile | wc -l && grep -o '}' Jenkinsfile | wc -l
```
预期两个数字相等60 上下,以实际为准)。
- [ ] **步骤 2结构核对清单人工比对文件内容**
- [ ] `pipeline { agent any; parameters; environment; stages; post }` 五段齐全
- [ ] 4 个参数名与规格一致PROFILE / NACOS_ADDR / NACOS_NAMESPACE / JAVA_OPTS
- [ ] 5 个 stageCheckout / Maven Build / Docker Build / Deploy / Health Check
- [ ] Deploy 中 6 个 `-e` 环境变量 + TZ + 日志卷挂载 + `--network host` + `--restart always`
- [ ] shell 中 `$(seq ...)` 已转义为 `\$(seq ...)`(避免被 Groovy 插值)
- [ ] `JAVA_OPTS` 注入带引号(值含空格)
---
### 任务 3统一提交可选需用户同意
- [ ] **步骤 1确认用户同意后提交**
```bash
git add Jenkinsfile \
docs/superpowers/specs/2026-07-16-jenkinsfile-monolith-deploy-design.md \
docs/superpowers/plans/2026-07-16-jenkinsfile-monolith-deploy.md
git commit -m "build新增 Jenkinsfile 单体部署 nl-server"
```
---
## 风险与注意事项
1. **构建机前提**Linux、JDK 17+、Maven、Docker、curl 已装且 Jenkins 用户有 docker 权限(在 docker 用户组)。
2. **真实验证需在 Jenkins 执行**:建 Pipeline 任务指向本仓库运行;首次运行参数页尚未生成,会用默认参数跑一次。
3. **Nacos 前置**nl-server 为 Spring Cloud 应用,启动依赖 Nacos 可达;若 Nacos 未就绪,健康检查会超时失败并打印容器日志。