feat: 优化部署脚本架构,支持Jenkins分离式CI/CD
��️ 架构优化: - 分离构建和部署阶段,符合Jenkins最佳实践 - Jenkins服务器负责构建,应用服务器负责运行 - 避免在生产服务器安装构建工具,提高安全性 📦 新增脚本: - build-all.sh - 专门的Jenkins构建脚本 - deploy-remote.sh - 专门的远程部署脚本 - Jenkins-Pipeline配置.md - 完整的Pipeline配置指南 🔄 部署模式: - full: 完整模式 (构建+部署) - build: 仅构建模式 (Jenkins阶段) - deploy: 仅部署模式 (远程阶段) ✨ 功能增强: - 智能jar包传输和验证 - 详细的构建产物报告 - 分阶段的错误处理和状态跟踪 - 支持多环境配置 (test/prod) 🛡️ 安全改进: - 严格的SSH连接格式验证 - 远程jar包完整性检查 - 容器化部署隔离 - 详细的操作日志记录 📊 监控增强: - 实时构建进度显示 - jar包大小统计 - 部署时间跟踪 - 健康检查验证 🔧 Jenkins集成: - 完整的Pipeline配置示例 - 环境变量支持 - 构建产物归档 - 邮件通知配置 ✅ 测试验证: - 所有脚本语法检查通过 - SSH连接测试成功 - 支持10个微服务模块 - 兼容现有部署流程
This commit is contained in:
@@ -0,0 +1,315 @@
|
||||
# 情感博物馆 Jenkins Pipeline 配置指南
|
||||
|
||||
## 概述
|
||||
|
||||
本文档描述了优化后的Jenkins CI/CD流水线配置,采用分离式部署架构:
|
||||
- **构建阶段**: 在Jenkins服务器上编译打包所有微服务
|
||||
- **部署阶段**: 将jar包传输到远程应用服务器并进行容器化部署
|
||||
|
||||
## 部署脚本架构
|
||||
|
||||
### 1. 脚本分类
|
||||
|
||||
#### 🔨 构建脚本
|
||||
- **`build-all.sh`**: 专门用于Jenkins构建阶段,编译所有微服务jar包
|
||||
- **特点**: 仅在Jenkins服务器执行,不涉及远程操作
|
||||
|
||||
#### 🚀 部署脚本
|
||||
- **`deploy-remote.sh`**: 专门用于远程部署,传输jar包并部署到应用服务器
|
||||
- **特点**: 假设jar包已构建完成,专注于远程部署
|
||||
|
||||
#### 🔄 综合脚本
|
||||
- **`deploy-all.sh`**: 支持多种模式的综合脚本
|
||||
- **模式**:
|
||||
- `full`: 完整模式 (构建+部署)
|
||||
- `build`: 仅构建模式
|
||||
- `deploy`: 仅部署模式
|
||||
|
||||
### 2. 服务列表
|
||||
|
||||
所有脚本支持以下10个微服务:
|
||||
|
||||
| 服务名称 | 端口 | 描述 |
|
||||
|---------|------|------|
|
||||
| emotion-gateway | 19000 | API网关服务 |
|
||||
| emotion-user | 19001 | 用户管理服务 |
|
||||
| emotion-ai | 19002 | AI聊天服务 |
|
||||
| emotion-record | 19003 | 记录管理服务 |
|
||||
| emotion-growth | 19004 | 成长跟踪服务 |
|
||||
| emotion-explore | 19005 | 探索服务 |
|
||||
| emotion-reward | 19006 | 奖励服务 |
|
||||
| emotion-websocket | 19007 | WebSocket服务 |
|
||||
| emotion-auth | 19008 | 认证服务 |
|
||||
| emotion-stats | 19009 | 统计服务 |
|
||||
|
||||
## Jenkins Pipeline 配置
|
||||
|
||||
### 1. 推荐的Pipeline配置
|
||||
|
||||
#### 方案一:分离式Pipeline (推荐)
|
||||
|
||||
```groovy
|
||||
pipeline {
|
||||
agent any
|
||||
|
||||
environment {
|
||||
DEPLOY_ENV = 'test'
|
||||
PROJECT_NAME = 'emotion-museum'
|
||||
REMOTE_HOST = 'root@47.111.10.27'
|
||||
}
|
||||
|
||||
stages {
|
||||
stage('Checkout') {
|
||||
steps {
|
||||
git branch: 'master', url: 'your-git-repo-url'
|
||||
}
|
||||
}
|
||||
|
||||
stage('Build') {
|
||||
steps {
|
||||
dir('backend') {
|
||||
sh './build-all.sh'
|
||||
}
|
||||
}
|
||||
post {
|
||||
always {
|
||||
// 归档构建产物
|
||||
archiveArtifacts artifacts: 'backend/*/target/*.jar', fingerprint: true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
stage('Deploy to Remote') {
|
||||
steps {
|
||||
dir('backend') {
|
||||
sh './deploy-remote.sh'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
stage('Health Check') {
|
||||
steps {
|
||||
script {
|
||||
// 等待服务启动
|
||||
sleep 30
|
||||
|
||||
// 检查关键服务
|
||||
def services = ['19000', '19001', '19002', '19008']
|
||||
services.each { port ->
|
||||
sh "curl -f http://47.111.10.27:${port}/actuator/health || exit 1"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
post {
|
||||
always {
|
||||
// 发送部署结果通知
|
||||
emailext (
|
||||
subject: "部署结果: ${env.JOB_NAME} - ${env.BUILD_NUMBER}",
|
||||
body: """
|
||||
部署状态: ${currentBuild.result}
|
||||
构建链接: ${env.BUILD_URL}
|
||||
部署环境: ${env.DEPLOY_ENV}
|
||||
""",
|
||||
to: "your-email@example.com"
|
||||
)
|
||||
}
|
||||
success {
|
||||
echo '🎉 部署成功!'
|
||||
}
|
||||
failure {
|
||||
echo '❌ 部署失败,请检查日志'
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 方案二:单一Pipeline
|
||||
|
||||
```groovy
|
||||
pipeline {
|
||||
agent any
|
||||
|
||||
environment {
|
||||
DEPLOY_ENV = 'test'
|
||||
DEPLOY_MODE = 'full' // full, build, deploy
|
||||
PROJECT_NAME = 'emotion-museum'
|
||||
}
|
||||
|
||||
stages {
|
||||
stage('Checkout') {
|
||||
steps {
|
||||
git branch: 'master', url: 'your-git-repo-url'
|
||||
}
|
||||
}
|
||||
|
||||
stage('Deploy') {
|
||||
steps {
|
||||
dir('backend') {
|
||||
sh './deploy-all.sh'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 环境变量配置
|
||||
|
||||
在Jenkins中配置以下环境变量:
|
||||
|
||||
#### 必需变量
|
||||
```bash
|
||||
# 部署配置
|
||||
DEPLOY_ENV=test # 部署环境
|
||||
DEPLOY_HOST=root@47.111.10.27 # 目标服务器
|
||||
PROJECT_NAME=emotion-museum # 项目名称
|
||||
|
||||
# 远程路径配置
|
||||
REMOTE_BUILD_DIR=/data/builds # jar包存储目录
|
||||
REMOTE_DOCKER_DIR=/data/docker # Docker配置目录
|
||||
```
|
||||
|
||||
#### 可选变量
|
||||
```bash
|
||||
# 部署模式 (仅deploy-all.sh使用)
|
||||
DEPLOY_MODE=full # full, build, deploy
|
||||
|
||||
# 数据库配置
|
||||
MYSQL_HOST=47.111.10.27
|
||||
MYSQL_PASSWORD=EmotionMuseum2025*#
|
||||
|
||||
# Nacos配置
|
||||
NACOS_SERVER_ADDR=47.111.10.27:8848
|
||||
NACOS_PASSWORD=Peanut2817*#
|
||||
```
|
||||
|
||||
### 3. 多环境部署配置
|
||||
|
||||
#### 测试环境
|
||||
```groovy
|
||||
environment {
|
||||
DEPLOY_ENV = 'test'
|
||||
DEPLOY_HOST = 'root@47.111.10.27'
|
||||
}
|
||||
```
|
||||
|
||||
#### 生产环境
|
||||
```groovy
|
||||
environment {
|
||||
DEPLOY_ENV = 'prod'
|
||||
DEPLOY_HOST = 'root@production-server'
|
||||
}
|
||||
```
|
||||
|
||||
## 使用方法
|
||||
|
||||
### 1. 本地测试
|
||||
|
||||
#### 仅构建
|
||||
```bash
|
||||
cd backend
|
||||
./build-all.sh
|
||||
```
|
||||
|
||||
#### 仅部署 (需要先有jar包)
|
||||
```bash
|
||||
cd backend
|
||||
./deploy-remote.sh
|
||||
```
|
||||
|
||||
#### 完整部署
|
||||
```bash
|
||||
cd backend
|
||||
./deploy-all.sh
|
||||
# 或指定模式
|
||||
DEPLOY_MODE=full ./deploy-all.sh
|
||||
```
|
||||
|
||||
### 2. Jenkins执行
|
||||
|
||||
#### 分离式执行
|
||||
```bash
|
||||
# 构建阶段
|
||||
./build-all.sh
|
||||
|
||||
# 部署阶段
|
||||
./deploy-remote.sh
|
||||
```
|
||||
|
||||
#### 综合执行
|
||||
```bash
|
||||
# 根据DEPLOY_MODE环境变量决定执行模式
|
||||
./deploy-all.sh
|
||||
```
|
||||
|
||||
## 优势特点
|
||||
|
||||
### 1. 🔄 分离式架构
|
||||
- **构建与部署分离**: Jenkins服务器专注构建,应用服务器专注运行
|
||||
- **资源优化**: 避免在应用服务器上安装构建工具
|
||||
- **安全性**: 减少应用服务器的攻击面
|
||||
|
||||
### 2. 🛡️ 容错机制
|
||||
- **单服务失败不影响其他服务**: 继续部署其他服务
|
||||
- **详细错误报告**: 每个服务的部署状态和错误信息
|
||||
- **回滚支持**: 保留旧版本容器,支持快速回滚
|
||||
|
||||
### 3. 📊 监控与报告
|
||||
- **实时日志**: 详细的部署过程日志
|
||||
- **健康检查**: 自动验证服务启动状态
|
||||
- **部署报告**: 完整的部署统计和结果报告
|
||||
|
||||
### 4. 🔧 灵活配置
|
||||
- **多模式支持**: 支持仅构建、仅部署、完整部署
|
||||
- **环境变量**: 支持Jenkins环境变量覆盖
|
||||
- **多环境**: 支持test/prod等多环境部署
|
||||
|
||||
## 故障排查
|
||||
|
||||
### 1. 构建失败
|
||||
```bash
|
||||
# 检查Java和Maven版本
|
||||
java -version
|
||||
mvn -version
|
||||
|
||||
# 查看详细构建日志
|
||||
./build-all.sh
|
||||
```
|
||||
|
||||
### 2. 部署失败
|
||||
```bash
|
||||
# 检查SSH连接
|
||||
ssh 'root@47.111.10.27' "echo 'test'"
|
||||
|
||||
# 检查远程Docker环境
|
||||
ssh 'root@47.111.10.27' "docker --version"
|
||||
|
||||
# 查看容器日志
|
||||
ssh 'root@47.111.10.27' "docker logs <service_name>"
|
||||
```
|
||||
|
||||
### 3. 服务启动失败
|
||||
```bash
|
||||
# 检查端口占用
|
||||
ssh 'root@47.111.10.27' "netstat -tlnp | grep <port>"
|
||||
|
||||
# 检查服务健康状态
|
||||
curl -f http://47.111.10.27:<port>/actuator/health
|
||||
```
|
||||
|
||||
## 联系支持
|
||||
|
||||
如遇到问题,请:
|
||||
1. 查看Jenkins构建日志
|
||||
2. 检查脚本执行日志
|
||||
3. 验证环境变量配置
|
||||
4. 联系开发团队并提供完整日志
|
||||
|
||||
---
|
||||
|
||||
**文档版本**: v2.0
|
||||
**更新时间**: 2025-07-18
|
||||
**维护团队**: 情感博物馆开发团队
|
||||
Reference in New Issue
Block a user