更新Jenkins配置支持SSH用户名密码认证 + 添加详细的Jenkins面板操作指南
- 修改Jenkinsfile支持SSH用户名密码认证方式 - 添加JENKINS_PANEL_GUIDE.md详细操作指南 - 添加QUICK_START.md快速配置清单 - 添加服务器配置脚本支持用户名密码认证 - 更新配置文档和部署说明
This commit is contained in:
parent
877335f73f
commit
abdb259a9f
260
JENKINS-SETUP.md
Normal file
260
JENKINS-SETUP.md
Normal file
@ -0,0 +1,260 @@
|
|||||||
|
# Jenkins配置指南
|
||||||
|
|
||||||
|
## 🚀 Jenkins CI/CD配置完整指南
|
||||||
|
|
||||||
|
### 📋 前置条件检查
|
||||||
|
|
||||||
|
**Jenkins服务器要求:**
|
||||||
|
- ✅ Jenkins 2.400+
|
||||||
|
- ✅ JDK 17
|
||||||
|
- ✅ Maven 3.9+
|
||||||
|
- ✅ Docker
|
||||||
|
- ✅ Git
|
||||||
|
|
||||||
|
**目标服务器要求:**
|
||||||
|
- ✅ Docker已安装
|
||||||
|
- ✅ SSH访问权限
|
||||||
|
- ✅ 防火墙配置(80、8080端口)
|
||||||
|
|
||||||
|
### 🔧 Step 1: Jenkins插件安装
|
||||||
|
|
||||||
|
在 `Jenkins管理 → 插件管理` 中安装以下插件:
|
||||||
|
|
||||||
|
```
|
||||||
|
必需插件:
|
||||||
|
- Maven Integration Plugin
|
||||||
|
- JaCoCo Plugin
|
||||||
|
- SonarQube Scanner Plugin
|
||||||
|
- Docker Pipeline Plugin
|
||||||
|
- SSH Agent Plugin
|
||||||
|
- Git Plugin
|
||||||
|
- Pipeline Plugin
|
||||||
|
|
||||||
|
推荐插件:
|
||||||
|
- Blue Ocean (可视化Pipeline)
|
||||||
|
- Timestamper (时间戳)
|
||||||
|
- Build Timeout (构建超时)
|
||||||
|
- Workspace Cleanup (工作空间清理)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 🛠️ Step 2: 全局工具配置
|
||||||
|
|
||||||
|
进入 `Jenkins管理 → 全局工具配置`:
|
||||||
|
|
||||||
|
**JDK配置:**
|
||||||
|
```
|
||||||
|
名称: JDK-17
|
||||||
|
JAVA_HOME: /usr/lib/jvm/java-17-openjdk
|
||||||
|
自动安装: ✅ (如果需要)
|
||||||
|
```
|
||||||
|
|
||||||
|
**Maven配置:**
|
||||||
|
```
|
||||||
|
名称: Maven-3.9.3
|
||||||
|
自动安装: ✅
|
||||||
|
版本: 3.9.3
|
||||||
|
```
|
||||||
|
|
||||||
|
**SonarQube Scanner配置:**
|
||||||
|
```
|
||||||
|
名称: SonarQube Scanner
|
||||||
|
自动安装: ✅
|
||||||
|
版本: Latest
|
||||||
|
```
|
||||||
|
|
||||||
|
**Docker配置:**
|
||||||
|
```
|
||||||
|
名称: Docker
|
||||||
|
自动安装: ✅ (或指定Docker路径)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 🔐 Step 3: 凭据配置
|
||||||
|
|
||||||
|
进入 `Jenkins管理 → 凭据`:
|
||||||
|
|
||||||
|
**SSH密钥配置:**
|
||||||
|
```
|
||||||
|
域: 全局凭据
|
||||||
|
类型: SSH Username with private key
|
||||||
|
ID: deploy-server-ssh
|
||||||
|
描述: Deploy Server SSH Key
|
||||||
|
用户名: root
|
||||||
|
私钥: [粘贴您的SSH私钥内容]
|
||||||
|
```
|
||||||
|
|
||||||
|
**SonarQube Token配置:**
|
||||||
|
```
|
||||||
|
域: 全局凭据
|
||||||
|
类型: Secret text
|
||||||
|
ID: sonar-token
|
||||||
|
Secret: squ_7e4217cabd0faae6f3b8ee359b3b8e2ac52eb69a
|
||||||
|
描述: SonarQube Authentication Token
|
||||||
|
```
|
||||||
|
|
||||||
|
### 🌐 Step 4: 系统配置
|
||||||
|
|
||||||
|
进入 `Jenkins管理 → 系统配置`:
|
||||||
|
|
||||||
|
**SonarQube服务器配置:**
|
||||||
|
```
|
||||||
|
名称: SonarQube
|
||||||
|
服务器URL: http://116.62.163.84:15010
|
||||||
|
认证令牌: [选择上面创建的sonar-token凭据]
|
||||||
|
```
|
||||||
|
|
||||||
|
**全局属性(可选):**
|
||||||
|
```
|
||||||
|
环境变量:
|
||||||
|
- DEPLOY_SERVER = 116.62.163.84
|
||||||
|
- DOCKER_REGISTRY = 116.62.163.84:5000 (如果有私有仓库)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 📦 Step 5: 创建Pipeline项目
|
||||||
|
|
||||||
|
1. **新建项目:**
|
||||||
|
```
|
||||||
|
点击 "新建任务"
|
||||||
|
输入项目名称: jenkins-demo
|
||||||
|
选择: Pipeline
|
||||||
|
点击 "确定"
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **配置项目:**
|
||||||
|
```
|
||||||
|
描述: Jenkins CI/CD Demo Project with Spring Boot 3
|
||||||
|
|
||||||
|
Pipeline配置:
|
||||||
|
- Definition: Pipeline script from SCM
|
||||||
|
- SCM: Git
|
||||||
|
- Repository URL: http://116.62.163.84:15006/wangtianqi/java_demo.git
|
||||||
|
- Credentials: [如果需要Git凭据]
|
||||||
|
- Branch Specifier: */main
|
||||||
|
- Script Path: Jenkinsfile
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **触发器配置:**
|
||||||
|
```
|
||||||
|
✅ GitHub hook trigger for GITScm polling (如果使用GitHub)
|
||||||
|
✅ Poll SCM: H/5 * * * * (每5分钟检查一次代码变更)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 🖥️ Step 6: 目标服务器配置
|
||||||
|
|
||||||
|
在目标服务器(116.62.163.84)上运行配置脚本:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. 上传配置脚本到服务器
|
||||||
|
scp server-setup.sh root@116.62.163.84:/tmp/
|
||||||
|
|
||||||
|
# 2. 登录服务器并运行配置
|
||||||
|
ssh root@116.62.163.84
|
||||||
|
chmod +x /tmp/server-setup.sh
|
||||||
|
/tmp/server-setup.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### 🔍 Step 7: SSH连接测试
|
||||||
|
|
||||||
|
在Jenkins服务器上测试SSH连接:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 测试SSH连接
|
||||||
|
ssh -o StrictHostKeyChecking=no root@116.62.163.84 "echo 'SSH连接成功'"
|
||||||
|
|
||||||
|
# 测试Docker命令
|
||||||
|
ssh root@116.62.163.84 "docker --version"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 🧪 Step 8: 第一次构建测试
|
||||||
|
|
||||||
|
1. **手动触发构建:**
|
||||||
|
- 进入项目页面
|
||||||
|
- 点击 "立即构建"
|
||||||
|
- 查看构建日志
|
||||||
|
|
||||||
|
2. **检查构建阶段:**
|
||||||
|
```
|
||||||
|
✅ Checkout - 代码检出
|
||||||
|
✅ 环境检查 - 工具版本验证
|
||||||
|
✅ 编译 - Maven编译
|
||||||
|
✅ 单元测试 - JUnit测试执行
|
||||||
|
✅ 代码质量扫描 - SonarQube分析
|
||||||
|
✅ 打包 - JAR文件生成
|
||||||
|
✅ Docker镜像构建
|
||||||
|
✅ 部署到目标服务器
|
||||||
|
✅ 健康检查
|
||||||
|
```
|
||||||
|
|
||||||
|
### 📊 Step 9: 监控和维护
|
||||||
|
|
||||||
|
**查看构建报告:**
|
||||||
|
- 测试报告:项目页面 → Test Result
|
||||||
|
- 代码覆盖率:项目页面 → Coverage Report
|
||||||
|
- SonarQube报告:http://116.62.163.84:15010
|
||||||
|
|
||||||
|
**应用监控:**
|
||||||
|
- 应用健康检查:http://116.62.163.84/api/health
|
||||||
|
- 应用信息:http://116.62.163.84/api/info
|
||||||
|
- API测试:http://116.62.163.84/api/users
|
||||||
|
|
||||||
|
**服务器维护:**
|
||||||
|
```bash
|
||||||
|
# 查看应用状态
|
||||||
|
ssh root@116.62.163.84 "/opt/jenkins-demo/monitor.sh"
|
||||||
|
|
||||||
|
# 查看应用日志
|
||||||
|
ssh root@116.62.163.84 "docker logs jenkins-demo-prod"
|
||||||
|
|
||||||
|
# 清理旧资源
|
||||||
|
ssh root@116.62.163.84 "/opt/jenkins-demo/cleanup.sh"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 🚨 常见问题解决
|
||||||
|
|
||||||
|
**问题1:SSH连接失败**
|
||||||
|
```bash
|
||||||
|
# 解决方案:检查SSH密钥配置
|
||||||
|
ssh-keygen -t rsa -b 4096
|
||||||
|
ssh-copy-id root@116.62.163.84
|
||||||
|
```
|
||||||
|
|
||||||
|
**问题2:Docker权限问题**
|
||||||
|
```bash
|
||||||
|
# 解决方案:添加jenkins用户到docker组
|
||||||
|
sudo usermod -aG docker jenkins
|
||||||
|
sudo systemctl restart jenkins
|
||||||
|
```
|
||||||
|
|
||||||
|
**问题3:SonarQube连接失败**
|
||||||
|
```bash
|
||||||
|
# 解决方案:检查SonarQube服务状态
|
||||||
|
curl -I http://116.62.163.84:15010
|
||||||
|
```
|
||||||
|
|
||||||
|
**问题4:部署失败**
|
||||||
|
```bash
|
||||||
|
# 解决方案:检查目标服务器状态
|
||||||
|
ssh root@116.62.163.84 "docker ps -a"
|
||||||
|
ssh root@116.62.163.84 "docker logs jenkins-demo-prod"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 🎯 成功标准
|
||||||
|
|
||||||
|
构建成功后,您应该能够:
|
||||||
|
|
||||||
|
1. ✅ 在Jenkins中看到绿色的构建状态
|
||||||
|
2. ✅ 访问 http://116.62.163.84/api/health 看到健康状态
|
||||||
|
3. ✅ 访问 http://116.62.163.84/api/users 看到用户列表
|
||||||
|
4. ✅ 在SonarQube中看到代码质量报告
|
||||||
|
5. ✅ 在Jenkins中看到测试报告和代码覆盖率
|
||||||
|
|
||||||
|
### 📞 技术支持
|
||||||
|
|
||||||
|
如果遇到问题,请检查:
|
||||||
|
1. Jenkins构建日志
|
||||||
|
2. 目标服务器Docker日志
|
||||||
|
3. SonarQube服务状态
|
||||||
|
4. 网络连接状况
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
🎉 **配置完成后,您的团队就可以享受完整的CI/CD流程了!**
|
346
JENKINS_PANEL_GUIDE.md
Normal file
346
JENKINS_PANEL_GUIDE.md
Normal file
@ -0,0 +1,346 @@
|
|||||||
|
# Jenkins面板完整构建配置指南
|
||||||
|
|
||||||
|
## 🎯 项目信息
|
||||||
|
- **Git仓库**: http://116.62.163.84:15006/wangtianqi/java_demo.git
|
||||||
|
- **目标服务器**: 116.62.163.84
|
||||||
|
- **SonarQube服务器**: http://116.62.163.84:15010
|
||||||
|
- **认证方式**: 用户名密码(SSH)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📋 第一部分:前期准备
|
||||||
|
|
||||||
|
### 1. 登录Jenkins
|
||||||
|
1. 打开浏览器,访问您的Jenkins服务器:
|
||||||
|
```
|
||||||
|
http://您的Jenkins服务器IP:8080
|
||||||
|
```
|
||||||
|
2. 输入管理员用户名和密码登录
|
||||||
|
|
||||||
|
### 2. 安装必需插件
|
||||||
|
**管理Jenkins** → **插件管理** → **可选插件**
|
||||||
|
|
||||||
|
搜索并安装以下插件:
|
||||||
|
```
|
||||||
|
✓ Maven Integration Plugin
|
||||||
|
✓ JaCoCo Plugin
|
||||||
|
✓ SonarQube Scanner Plugin
|
||||||
|
✓ Docker Pipeline Plugin
|
||||||
|
✓ SSH Agent Plugin
|
||||||
|
✓ Git Plugin
|
||||||
|
✓ Pipeline Plugin
|
||||||
|
✓ Credentials Binding Plugin
|
||||||
|
✓ Blue Ocean Plugin (推荐)
|
||||||
|
```
|
||||||
|
|
||||||
|
**安装步骤:**
|
||||||
|
1. 勾选需要的插件
|
||||||
|
2. 点击 **"直接安装"**
|
||||||
|
3. 等待安装完成并重启Jenkins
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔧 第二部分:系统配置
|
||||||
|
|
||||||
|
### 1. 配置全局工具
|
||||||
|
**管理Jenkins** → **全局工具配置**
|
||||||
|
|
||||||
|
#### 1.1 JDK配置
|
||||||
|
- 点击 **"新增JDK"**
|
||||||
|
- **Name**: `JDK-17`
|
||||||
|
- **JAVA_HOME**: `/usr/lib/jvm/java-17-openjdk`(Linux)或您的JDK安装路径
|
||||||
|
- 取消勾选 **"自动安装"**
|
||||||
|
|
||||||
|
#### 1.2 Maven配置
|
||||||
|
- 点击 **"新增Maven"**
|
||||||
|
- **Name**: `Maven-3.9.3`
|
||||||
|
- 勾选 **"自动安装"**
|
||||||
|
- **版本**: 选择 `3.9.3`
|
||||||
|
|
||||||
|
#### 1.3 Git配置(如果需要)
|
||||||
|
- 通常系统已有Git,保持默认即可
|
||||||
|
|
||||||
|
### 2. 配置SonarQube服务器
|
||||||
|
**管理Jenkins** → **系统配置** → **SonarQube servers**
|
||||||
|
|
||||||
|
- 点击 **"Add SonarQube"**
|
||||||
|
- **Name**: `SonarQube`
|
||||||
|
- **Server URL**: `http://116.62.163.84:15010`
|
||||||
|
- **Server authentication token**: `squ_7e4217cabd0faae6f3b8ee359b3b8e2ac52eb69a`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔐 第三部分:凭据配置
|
||||||
|
|
||||||
|
### 1. 配置Git凭据
|
||||||
|
**管理Jenkins** → **凭据** → **系统** → **全局凭据** → **添加凭据**
|
||||||
|
|
||||||
|
**Git仓库访问凭据:**
|
||||||
|
- **类型**: `Username with password`
|
||||||
|
- **范围**: `全局`
|
||||||
|
- **用户名**: `wangtianqi`
|
||||||
|
- **密码**: `[您的Git密码]`
|
||||||
|
- **ID**: `git-credentials`
|
||||||
|
- **描述**: `Git Repository Access`
|
||||||
|
|
||||||
|
### 2. 配置SSH服务器凭据
|
||||||
|
**继续添加凭据**
|
||||||
|
|
||||||
|
**服务器SSH访问凭据:**
|
||||||
|
- **类型**: `Username with password`
|
||||||
|
- **范围**: `全局`
|
||||||
|
- **用户名**: `root`
|
||||||
|
- **密码**: `[您的服务器root密码]`
|
||||||
|
- **ID**: `deploy-server-ssh`
|
||||||
|
- **描述**: `Deploy Server SSH Access`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🚀 第四部分:创建Pipeline项目
|
||||||
|
|
||||||
|
### 1. 创建新项目
|
||||||
|
1. 回到Jenkins首页
|
||||||
|
2. 点击左侧 **"新建任务"** 或 **"New Item"**
|
||||||
|
3. **输入任务名称**: `java-demo-pipeline`
|
||||||
|
4. **选择类型**: `Pipeline`
|
||||||
|
5. 点击 **"确定"**
|
||||||
|
|
||||||
|
### 2. 配置项目基本信息
|
||||||
|
|
||||||
|
#### 2.1 基本设置
|
||||||
|
- **描述**:
|
||||||
|
```
|
||||||
|
Jenkins CI/CD Demo Project with Spring Boot 3
|
||||||
|
用于演示完整的CI/CD流程,包括代码拉取、编译构建、单元测试、代码扫描、Docker打包和部署
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 2.2 构建保留策略
|
||||||
|
- 勾选 **"丢弃旧的构建"**
|
||||||
|
- **保持构建的最大个数**: `10`
|
||||||
|
- **保持构建的天数**: `30`
|
||||||
|
|
||||||
|
#### 2.3 构建触发器(可选)
|
||||||
|
- **GitHub hook trigger for GITScm polling**: 勾选此项实现代码提交自动构建
|
||||||
|
- **轮询SCM**: 输入 `H/5 * * * *`(每5分钟检查一次代码变更)
|
||||||
|
|
||||||
|
### 3. 配置Pipeline
|
||||||
|
|
||||||
|
#### 3.1 Pipeline基本配置
|
||||||
|
- **Definition**: 选择 `Pipeline script from SCM`
|
||||||
|
- **SCM**: 选择 `Git`
|
||||||
|
|
||||||
|
#### 3.2 Git仓库配置
|
||||||
|
- **Repository URL**:
|
||||||
|
```
|
||||||
|
http://116.62.163.84:15006/wangtianqi/java_demo.git
|
||||||
|
```
|
||||||
|
- **Credentials**: 选择之前创建的 `git-credentials`
|
||||||
|
- **Branch Specifier**: `*/main`
|
||||||
|
|
||||||
|
#### 3.3 Script Path
|
||||||
|
- **Script Path**: `Jenkinsfile`
|
||||||
|
|
||||||
|
#### 3.4 轻量级检出(推荐)
|
||||||
|
- 勾选 **"Lightweight checkout"**
|
||||||
|
|
||||||
|
### 4. 保存配置
|
||||||
|
点击页面底部的 **"保存"**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎬 第五部分:执行构建
|
||||||
|
|
||||||
|
### 1. 立即构建
|
||||||
|
1. 在项目主页点击左侧 **"立即构建"** 或 **"Build Now"**
|
||||||
|
2. 系统开始执行Pipeline
|
||||||
|
|
||||||
|
### 2. 监控构建过程
|
||||||
|
|
||||||
|
#### 2.1 查看构建历史
|
||||||
|
- 在左侧 **"构建历史"** 中可以看到构建列表
|
||||||
|
- 点击构建号(如 #1)进入构建详情
|
||||||
|
|
||||||
|
#### 2.2 查看控制台输出
|
||||||
|
- 在构建详情页面点击 **"控制台输出"**
|
||||||
|
- 可以实时查看构建日志
|
||||||
|
|
||||||
|
#### 2.3 使用Blue Ocean界面(推荐)
|
||||||
|
1. 点击左侧 **"Open Blue Ocean"**
|
||||||
|
2. 可以看到可视化的Pipeline流程
|
||||||
|
3. 每个阶段的状态一目了然
|
||||||
|
|
||||||
|
### 3. 构建阶段说明
|
||||||
|
|
||||||
|
构建将按以下顺序执行:
|
||||||
|
|
||||||
|
1. **🔄 Checkout** - 代码检出
|
||||||
|
- 从Git仓库拉取最新代码
|
||||||
|
- 显示Git提交ID
|
||||||
|
|
||||||
|
2. **🔍 环境检查** - 环境验证
|
||||||
|
- 检查Java版本
|
||||||
|
- 检查Maven版本
|
||||||
|
- 检查Git版本
|
||||||
|
|
||||||
|
3. **🔨 编译** - 代码编译
|
||||||
|
- 执行 `mvn clean compile`
|
||||||
|
- 跳过测试阶段
|
||||||
|
|
||||||
|
4. **🧪 单元测试** - 测试执行
|
||||||
|
- 运行所有单元测试
|
||||||
|
- 生成测试报告和代码覆盖率
|
||||||
|
|
||||||
|
5. **🔍 代码质量扫描** - SonarQube分析
|
||||||
|
- 静态代码分析
|
||||||
|
- 代码质量评估
|
||||||
|
|
||||||
|
6. **📦 打包** - 应用打包
|
||||||
|
- 生成可执行JAR文件
|
||||||
|
- 归档构建产物
|
||||||
|
|
||||||
|
7. **🐳 构建Docker镜像** - 容器化
|
||||||
|
- 构建Docker镜像
|
||||||
|
- 创建版本标签
|
||||||
|
|
||||||
|
8. **📤 传输Docker镜像** - 镜像部署
|
||||||
|
- 将镜像传输到目标服务器
|
||||||
|
- 在目标服务器加载镜像
|
||||||
|
|
||||||
|
9. **🚀 部署应用** - 环境部署
|
||||||
|
- **测试环境**: develop/feature分支 → 端口8080
|
||||||
|
- **生产环境**: main/master分支 → 端口80
|
||||||
|
|
||||||
|
10. **🏥 健康检查** - 应用验证
|
||||||
|
- 等待应用启动
|
||||||
|
- 验证健康检查接口
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 第六部分:查看构建结果
|
||||||
|
|
||||||
|
### 1. 构建状态说明
|
||||||
|
- **🔵 蓝色**: 构建成功
|
||||||
|
- **🔴 红色**: 构建失败
|
||||||
|
- **🟡 黄色**: 构建不稳定(测试失败但编译成功)
|
||||||
|
- **⚪ 灰色**: 构建被取消或未执行
|
||||||
|
|
||||||
|
### 2. 查看测试报告
|
||||||
|
1. 进入构建详情页面
|
||||||
|
2. 点击 **"测试结果"**
|
||||||
|
3. 查看单元测试通过率和详细结果
|
||||||
|
|
||||||
|
### 3. 查看代码覆盖率
|
||||||
|
1. 在构建详情页面找到 **"JaCoCo代码覆盖率"**
|
||||||
|
2. 查看代码覆盖率报告
|
||||||
|
3. 分析哪些代码未被测试覆盖
|
||||||
|
|
||||||
|
### 4. 查看SonarQube报告
|
||||||
|
1. 构建成功后访问:`http://116.62.163.84:15010`
|
||||||
|
2. 找到项目:`jenkins-demo`
|
||||||
|
3. 查看代码质量分析结果
|
||||||
|
|
||||||
|
### 5. 验证部署结果
|
||||||
|
构建成功后,根据分支验证部署:
|
||||||
|
|
||||||
|
**测试环境(develop分支):**
|
||||||
|
```bash
|
||||||
|
curl http://116.62.163.84:8080/api/health
|
||||||
|
curl http://116.62.163.84:8080/api/users
|
||||||
|
```
|
||||||
|
|
||||||
|
**生产环境(main分支):**
|
||||||
|
```bash
|
||||||
|
curl http://116.62.163.84/api/health
|
||||||
|
curl http://116.62.163.84/api/users
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔧 第七部分:故障排除
|
||||||
|
|
||||||
|
### 常见问题及解决方案
|
||||||
|
|
||||||
|
#### 1. Git克隆失败
|
||||||
|
**现象**: `fatal: could not read Username`
|
||||||
|
**解决**:
|
||||||
|
- 检查Git凭据配置是否正确
|
||||||
|
- 确认仓库URL可以访问
|
||||||
|
- 验证用户名密码是否正确
|
||||||
|
|
||||||
|
#### 2. Maven构建失败
|
||||||
|
**现象**: `command not found: mvn`
|
||||||
|
**解决**:
|
||||||
|
- 检查Maven工具配置
|
||||||
|
- 确认Maven自动安装是否完成
|
||||||
|
- 查看系统环境变量设置
|
||||||
|
|
||||||
|
#### 3. Docker构建失败
|
||||||
|
**现象**: `Cannot connect to the Docker daemon`
|
||||||
|
**解决**:
|
||||||
|
- 确认Jenkins服务器已安装Docker
|
||||||
|
- 检查Jenkins用户是否在docker组
|
||||||
|
- 确认Docker服务是否运行
|
||||||
|
|
||||||
|
#### 4. SSH连接失败
|
||||||
|
**现象**: `Permission denied (publickey,password)`
|
||||||
|
**解决**:
|
||||||
|
- 检查SSH凭据用户名密码
|
||||||
|
- 确认目标服务器允许密码认证
|
||||||
|
- 检查防火墙设置
|
||||||
|
|
||||||
|
#### 5. 健康检查失败
|
||||||
|
**现象**: `应用健康检查失败,HTTP状态码: 000`
|
||||||
|
**解决**:
|
||||||
|
- 检查应用是否正常启动
|
||||||
|
- 确认端口映射是否正确
|
||||||
|
- 查看Docker容器日志
|
||||||
|
|
||||||
|
### 日志查看方式
|
||||||
|
```bash
|
||||||
|
# 查看构建日志
|
||||||
|
Jenkins控制台输出
|
||||||
|
|
||||||
|
# 查看应用日志
|
||||||
|
docker logs jenkins-demo-prod
|
||||||
|
docker logs jenkins-demo-test
|
||||||
|
|
||||||
|
# 查看系统日志
|
||||||
|
journalctl -u docker
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📈 第八部分:高级配置
|
||||||
|
|
||||||
|
### 1. 配置构建通知
|
||||||
|
可以配置邮件、钉钉、企业微信等通知方式
|
||||||
|
|
||||||
|
### 2. 配置多分支Pipeline
|
||||||
|
支持自动发现和构建Git仓库的多个分支
|
||||||
|
|
||||||
|
### 3. 配置并行构建
|
||||||
|
充分利用服务器资源,加快构建速度
|
||||||
|
|
||||||
|
### 4. 配置构建缓存
|
||||||
|
缓存Maven依赖,减少构建时间
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎉 完成!
|
||||||
|
|
||||||
|
配置完成后,您的CI/CD流程就搭建好了!
|
||||||
|
|
||||||
|
**工作流程:**
|
||||||
|
1. 开发人员提交代码到Git仓库
|
||||||
|
2. Jenkins自动检测代码变更
|
||||||
|
3. 执行完整的构建、测试、部署流程
|
||||||
|
4. 自动部署到对应环境
|
||||||
|
5. 发送构建结果通知
|
||||||
|
|
||||||
|
**访问地址:**
|
||||||
|
- Jenkins: `http://您的Jenkins服务器:8080`
|
||||||
|
- SonarQube: `http://116.62.163.84:15010`
|
||||||
|
- 应用生产环境: `http://116.62.163.84`
|
||||||
|
- 应用测试环境: `http://116.62.163.84:8080`
|
||||||
|
|
||||||
|
现在您的团队可以享受高效的DevOps工作流程了!🚀
|
204
JENKINS_PASSWORD_SETUP.md
Normal file
204
JENKINS_PASSWORD_SETUP.md
Normal file
@ -0,0 +1,204 @@
|
|||||||
|
# Jenkins 用户名密码配置快速指南
|
||||||
|
|
||||||
|
## 🚀 简化配置步骤(使用用户名密码)
|
||||||
|
|
||||||
|
### 1. 准备工作
|
||||||
|
|
||||||
|
#### 1.1 确保目标服务器SSH配置
|
||||||
|
在您的目标服务器 (116.62.163.84) 上执行:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 编辑SSH配置文件
|
||||||
|
sudo vi /etc/ssh/sshd_config
|
||||||
|
|
||||||
|
# 确保以下配置项
|
||||||
|
PasswordAuthentication yes
|
||||||
|
PermitRootLogin yes
|
||||||
|
|
||||||
|
# 重启SSH服务
|
||||||
|
sudo systemctl restart sshd
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 1.2 安装sshpass(在Jenkins服务器上)
|
||||||
|
```bash
|
||||||
|
# Ubuntu/Debian
|
||||||
|
sudo apt-get update && sudo apt-get install -y sshpass
|
||||||
|
|
||||||
|
# CentOS/RHEL
|
||||||
|
sudo yum install -y sshpass
|
||||||
|
|
||||||
|
# 或者通过EPEL仓库
|
||||||
|
sudo yum install -y epel-release
|
||||||
|
sudo yum install -y sshpass
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Jenkins凭据配置
|
||||||
|
|
||||||
|
#### 2.1 Git仓库凭据
|
||||||
|
1. **管理Jenkins** → **凭据** → **系统** → **全局凭据** → **添加凭据**
|
||||||
|
2. 配置信息:
|
||||||
|
```
|
||||||
|
类型: Username with password
|
||||||
|
范围: 全局
|
||||||
|
用户名: wangtianqi
|
||||||
|
密码: [您的Git密码]
|
||||||
|
ID: git-credentials
|
||||||
|
描述: Git Repository Access
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 2.2 服务器SSH凭据
|
||||||
|
1. **管理Jenkins** → **凭据** → **系统** → **全局凭据** → **添加凭据**
|
||||||
|
2. 配置信息:
|
||||||
|
```
|
||||||
|
类型: Username with password
|
||||||
|
范围: 全局
|
||||||
|
用户名: root
|
||||||
|
密码: [服务器root密码]
|
||||||
|
ID: deploy-server-ssh
|
||||||
|
描述: Deploy Server SSH Access
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. 创建Pipeline项目
|
||||||
|
|
||||||
|
#### 3.1 新建项目
|
||||||
|
1. **Jenkins首页** → **新建任务**
|
||||||
|
2. **任务名称**: `java-demo-pipeline`
|
||||||
|
3. **选择类型**: `Pipeline`
|
||||||
|
4. **点击确定**
|
||||||
|
|
||||||
|
#### 3.2 配置Pipeline
|
||||||
|
在项目配置页面的**Pipeline**部分:
|
||||||
|
|
||||||
|
```
|
||||||
|
Definition: Pipeline script from SCM
|
||||||
|
SCM: Git
|
||||||
|
Repository URL: http://116.62.163.84:15006/wangtianqi/java_demo.git
|
||||||
|
Credentials: git-credentials (选择刚创建的Git凭据)
|
||||||
|
Branch: */main
|
||||||
|
Script Path: Jenkinsfile
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. 工具配置
|
||||||
|
|
||||||
|
#### 4.1 JDK配置
|
||||||
|
**管理Jenkins** → **全局工具配置** → **JDK**
|
||||||
|
```
|
||||||
|
名称: JDK-17
|
||||||
|
自动安装: 勾选
|
||||||
|
版本: Java 17 (或手动指定JAVA_HOME)
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 4.2 Maven配置
|
||||||
|
**管理Jenkins** → **全局工具配置** → **Maven**
|
||||||
|
```
|
||||||
|
名称: Maven-3.9.3
|
||||||
|
自动安装: 勾选
|
||||||
|
版本: 3.9.3
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. 必需插件
|
||||||
|
|
||||||
|
在**管理Jenkins** → **插件管理**中安装:
|
||||||
|
|
||||||
|
```
|
||||||
|
✅ Maven Integration Plugin
|
||||||
|
✅ JaCoCo Plugin
|
||||||
|
✅ Docker Pipeline Plugin
|
||||||
|
✅ Credentials Plugin (通常已预装)
|
||||||
|
✅ SSH Credentials Plugin
|
||||||
|
✅ Pipeline Plugin (通常已预装)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6. 测试连接
|
||||||
|
|
||||||
|
#### 6.1 测试Git连接
|
||||||
|
在Pipeline项目中点击**立即构建**,查看是否能成功克隆代码。
|
||||||
|
|
||||||
|
#### 6.2 测试SSH连接
|
||||||
|
您可以在Jenkins的**脚本命令行**中测试SSH连接:
|
||||||
|
|
||||||
|
**管理Jenkins** → **脚本命令行**,输入:
|
||||||
|
|
||||||
|
```groovy
|
||||||
|
withCredentials([usernamePassword(credentialsId: 'deploy-server-ssh', usernameVariable: 'SSH_USER', passwordVariable: 'SSH_PASS')]) {
|
||||||
|
sh 'sshpass -p "$SSH_PASS" ssh -o StrictHostKeyChecking=no $SSH_USER@116.62.163.84 "echo \'SSH连接成功!\'"'
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7. 构建执行
|
||||||
|
|
||||||
|
1. **保存项目配置**
|
||||||
|
2. **点击立即构建**
|
||||||
|
3. **查看构建日志**:点击构建号 → **控制台输出**
|
||||||
|
|
||||||
|
### 8. 构建流程说明
|
||||||
|
|
||||||
|
```
|
||||||
|
🔄 代码检出 → 🔍 环境检查 → 🔨 编译 → 🧪 单元测试
|
||||||
|
↓
|
||||||
|
🔍 代码扫描 → 📦 打包 → 🐳 构建镜像 → 📤 传输镜像
|
||||||
|
↓
|
||||||
|
🚀 部署应用 → 🏥 健康检查 → ✅ 完成
|
||||||
|
```
|
||||||
|
|
||||||
|
### 9. 分支部署策略
|
||||||
|
|
||||||
|
- **main/master分支**: 部署到生产环境 (端口80)
|
||||||
|
- **develop分支**: 部署到测试环境 (端口8080)
|
||||||
|
- **feature分支**: 部署到测试环境 (端口8080)
|
||||||
|
|
||||||
|
### 10. 验证部署
|
||||||
|
|
||||||
|
构建成功后访问:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 生产环境 (main分支)
|
||||||
|
curl http://116.62.163.84/api/health
|
||||||
|
|
||||||
|
# 测试环境 (develop分支)
|
||||||
|
curl http://116.62.163.84:8080/api/health
|
||||||
|
```
|
||||||
|
|
||||||
|
### 11. 常见问题
|
||||||
|
|
||||||
|
#### Q1: sshpass命令未找到
|
||||||
|
**解决方案**: 在Jenkins服务器上安装sshpass
|
||||||
|
```bash
|
||||||
|
sudo apt-get install sshpass # Ubuntu
|
||||||
|
sudo yum install sshpass # CentOS
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Q2: SSH连接被拒绝
|
||||||
|
**解决方案**: 检查目标服务器SSH配置
|
||||||
|
```bash
|
||||||
|
# 在目标服务器上
|
||||||
|
sudo vi /etc/ssh/sshd_config
|
||||||
|
# 确保 PasswordAuthentication yes
|
||||||
|
sudo systemctl restart sshd
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Q3: Docker权限不足
|
||||||
|
**解决方案**: 将jenkins用户添加到docker组
|
||||||
|
```bash
|
||||||
|
sudo usermod -aG docker jenkins
|
||||||
|
sudo systemctl restart jenkins
|
||||||
|
```
|
||||||
|
|
||||||
|
### 12. 安全建议
|
||||||
|
|
||||||
|
1. **使用强密码**: 确保服务器密码足够复杂
|
||||||
|
2. **限制SSH访问**: 配置防火墙仅允许Jenkins服务器访问
|
||||||
|
3. **定期更新密码**: 定期修改服务器密码并更新Jenkins凭据
|
||||||
|
4. **监控登录日志**: 定期检查服务器登录日志
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎉 完成!
|
||||||
|
|
||||||
|
按照以上步骤配置后,您就可以使用用户名密码的方式进行Jenkins CI/CD了!
|
||||||
|
|
||||||
|
如果遇到问题,请检查:
|
||||||
|
1. 凭据ID是否正确 (`deploy-server-ssh`)
|
||||||
|
2. 用户名密码是否正确
|
||||||
|
3. 目标服务器SSH服务是否正常
|
||||||
|
4. Jenkins服务器是否安装了sshpass
|
212
JENKINS_SETUP.md
Normal file
212
JENKINS_SETUP.md
Normal file
@ -0,0 +1,212 @@
|
|||||||
|
# Jenkins CI/CD 配置指南
|
||||||
|
|
||||||
|
## 🎯 项目信息
|
||||||
|
- **Git仓库**: http://116.62.163.84:15006/wangtianqi/java_demo.git
|
||||||
|
- **目标服务器**: 116.62.163.84
|
||||||
|
- **SonarQube服务器**: http://116.62.163.84:15010
|
||||||
|
- **SonarQube Token**: squ_7e4217cabd0faae6f3b8ee359b3b8e2ac52eb69a
|
||||||
|
|
||||||
|
## 📋 Jenkins配置步骤
|
||||||
|
|
||||||
|
### 1. 创建Pipeline项目
|
||||||
|
|
||||||
|
1. **登录Jenkins** → **新建任务**
|
||||||
|
2. **输入任务名称**: `java-demo-pipeline`
|
||||||
|
3. **选择Pipeline** → **确定**
|
||||||
|
|
||||||
|
### 2. 配置项目
|
||||||
|
|
||||||
|
#### 基本配置
|
||||||
|
- **描述**: Jenkins CI/CD Demo Project with Spring Boot 3
|
||||||
|
- **GitHub项目**: http://116.62.163.84:15006/wangtianqi/java_demo.git
|
||||||
|
|
||||||
|
#### Pipeline配置
|
||||||
|
- **Definition**: Pipeline script from SCM
|
||||||
|
- **SCM**: Git
|
||||||
|
- **Repository URL**: http://116.62.163.84:15006/wangtianqi/java_demo.git
|
||||||
|
- **Credentials**: 添加Git凭据(用户名:wangtianqi)
|
||||||
|
- **Branch**: */main
|
||||||
|
- **Script Path**: Jenkinsfile
|
||||||
|
|
||||||
|
### 3. 必需的Jenkins插件
|
||||||
|
|
||||||
|
确保以下插件已安装:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 必需插件列表
|
||||||
|
- Maven Integration Plugin
|
||||||
|
- JaCoCo Plugin
|
||||||
|
- SonarQube Scanner Plugin
|
||||||
|
- Docker Pipeline Plugin
|
||||||
|
- SSH Agent Plugin
|
||||||
|
- Publish Over SSH Plugin
|
||||||
|
- Blue Ocean Plugin (推荐)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. 工具配置
|
||||||
|
|
||||||
|
#### 4.1 JDK配置
|
||||||
|
- **管理Jenkins** → **工具配置** → **JDK**
|
||||||
|
- **Name**: JDK-17
|
||||||
|
- **JAVA_HOME**: /usr/lib/jvm/java-17-openjdk
|
||||||
|
|
||||||
|
#### 4.2 Maven配置
|
||||||
|
- **管理Jenkins** → **工具配置** → **Maven**
|
||||||
|
- **Name**: Maven-3.9.3
|
||||||
|
- **MAVEN_HOME**: /opt/maven
|
||||||
|
|
||||||
|
#### 4.3 SonarQube配置
|
||||||
|
- **管理Jenkins** → **系统配置** → **SonarQube servers**
|
||||||
|
- **Name**: SonarQube
|
||||||
|
- **Server URL**: http://116.62.163.84:15010
|
||||||
|
- **Server authentication token**: squ_7e4217cabd0faae6f3b8ee359b3b8e2ac52eb69a
|
||||||
|
|
||||||
|
### 5. 凭据配置
|
||||||
|
|
||||||
|
#### 5.1 Git凭据
|
||||||
|
- **管理Jenkins** → **凭据管理** → **添加凭据**
|
||||||
|
- **类型**: Username with password
|
||||||
|
- **ID**: git-credentials
|
||||||
|
- **用户名**: wangtianqi
|
||||||
|
- **密码**: [您的Git密码]
|
||||||
|
|
||||||
|
#### 5.2 服务器SSH凭据(用户名密码方式)
|
||||||
|
- **管理Jenkins** → **凭据管理** → **添加凭据**
|
||||||
|
- **类型**: Username with password
|
||||||
|
- **ID**: deploy-server-ssh
|
||||||
|
- **用户名**: root (或您的服务器用户名)
|
||||||
|
- **密码**: [服务器用户密码]
|
||||||
|
- **描述**: Deploy Server SSH Credentials
|
||||||
|
|
||||||
|
> **注意**: 使用用户名密码方式需要在Jenkins服务器上安装 `sshpass` 工具。大多数现代Linux发行版都可以通过包管理器安装。
|
||||||
|
|
||||||
|
### 6. 环境要求
|
||||||
|
|
||||||
|
#### 6.1 Jenkins服务器环境
|
||||||
|
```bash
|
||||||
|
# 必需软件
|
||||||
|
- JDK 17
|
||||||
|
- Maven 3.9+
|
||||||
|
- Docker
|
||||||
|
- Git
|
||||||
|
- curl
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 6.2 目标服务器环境 (116.62.163.84)
|
||||||
|
```bash
|
||||||
|
# 必需软件
|
||||||
|
- Docker
|
||||||
|
- Docker Compose (可选)
|
||||||
|
|
||||||
|
# 防火墙配置
|
||||||
|
- 开放端口 80 (生产环境)
|
||||||
|
- 开放端口 8080 (测试环境)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7. Pipeline流程
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
graph TD
|
||||||
|
A[代码检出] --> B[环境检查]
|
||||||
|
B --> C[编译]
|
||||||
|
C --> D[单元测试]
|
||||||
|
D --> E[代码质量扫描]
|
||||||
|
E --> F[打包]
|
||||||
|
F --> G[构建Docker镜像]
|
||||||
|
G --> H{分支判断}
|
||||||
|
H -->|develop/feature| I[部署到测试环境]
|
||||||
|
H -->|main/master| J[部署到生产环境]
|
||||||
|
I --> K[健康检查]
|
||||||
|
J --> K
|
||||||
|
K --> L[完成]
|
||||||
|
```
|
||||||
|
|
||||||
|
### 8. 部署说明
|
||||||
|
|
||||||
|
#### 8.1 测试环境部署
|
||||||
|
- **触发条件**: develop 或 feature/* 分支
|
||||||
|
- **端口**: 8080
|
||||||
|
- **容器名**: jenkins-demo-test
|
||||||
|
|
||||||
|
#### 8.2 生产环境部署
|
||||||
|
- **触发条件**: main 或 master 分支
|
||||||
|
- **端口**: 80
|
||||||
|
- **容器名**: jenkins-demo-prod
|
||||||
|
- **需要手动确认**
|
||||||
|
|
||||||
|
### 9. 监控地址
|
||||||
|
|
||||||
|
部署完成后的访问地址:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 生产环境
|
||||||
|
http://116.62.163.84/api/health # 健康检查
|
||||||
|
http://116.62.163.84/api/users # 用户管理API
|
||||||
|
http://116.62.163.84/api/info # 应用信息
|
||||||
|
|
||||||
|
# 测试环境
|
||||||
|
http://116.62.163.84:8080/api/health # 健康检查
|
||||||
|
http://116.62.163.84:8080/api/users # 用户管理API
|
||||||
|
http://116.62.163.84:8080/api/info # 应用信息
|
||||||
|
```
|
||||||
|
|
||||||
|
### 10. 故障排除
|
||||||
|
|
||||||
|
#### 10.1 常见问题
|
||||||
|
|
||||||
|
**构建失败**
|
||||||
|
```bash
|
||||||
|
# 检查Jenkins日志
|
||||||
|
cat /var/log/jenkins/jenkins.log
|
||||||
|
|
||||||
|
# 检查Maven配置
|
||||||
|
mvn -version
|
||||||
|
|
||||||
|
# 检查JDK配置
|
||||||
|
java -version
|
||||||
|
```
|
||||||
|
|
||||||
|
**部署失败**
|
||||||
|
```bash
|
||||||
|
# 检查目标服务器Docker状态
|
||||||
|
docker ps -a
|
||||||
|
docker logs jenkins-demo-prod
|
||||||
|
|
||||||
|
# 检查端口占用
|
||||||
|
netstat -tlnp | grep :80
|
||||||
|
```
|
||||||
|
|
||||||
|
**SonarQube扫描失败**
|
||||||
|
```bash
|
||||||
|
# 检查SonarQube服务状态
|
||||||
|
curl http://116.62.163.84:15010/api/system/status
|
||||||
|
|
||||||
|
# 验证Token
|
||||||
|
curl -u squ_7e4217cabd0faae6f3b8ee359b3b8e2ac52eb69a: http://116.62.163.84:15010/api/authentication/validate
|
||||||
|
```
|
||||||
|
|
||||||
|
### 11. 构建触发器
|
||||||
|
|
||||||
|
可以配置以下触发器:
|
||||||
|
|
||||||
|
- **轮询SCM**: `H/5 * * * *` (每5分钟检查一次)
|
||||||
|
- **Webhook**: 在Git仓库配置Webhook
|
||||||
|
- **定时构建**: `H 2 * * *` (每天凌晨2点)
|
||||||
|
|
||||||
|
### 12. 通知配置
|
||||||
|
|
||||||
|
可以配置以下通知方式:
|
||||||
|
|
||||||
|
- **邮件通知**: 构建结果发送邮件
|
||||||
|
- **钉钉通知**: 集成钉钉机器人
|
||||||
|
- **企业微信**: 集成企业微信机器人
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎉 完成!
|
||||||
|
|
||||||
|
配置完成后,您的团队就可以享受完整的CI/CD流程了:
|
||||||
|
1. **代码提交** → **自动构建** → **自动测试** → **代码扫描** → **自动部署**
|
||||||
|
2. **质量保证**: 单元测试覆盖率、代码质量检查
|
||||||
|
3. **快速反馈**: 构建失败立即通知,快速定位问题
|
||||||
|
4. **环境一致性**: Docker容器化部署,确保环境一致性
|
87
Jenkinsfile
vendored
87
Jenkinsfile
vendored
@ -12,14 +12,17 @@ pipeline {
|
|||||||
MAVEN_HOME = '/opt/maven'
|
MAVEN_HOME = '/opt/maven'
|
||||||
PATH = "${MAVEN_HOME}/bin:${JAVA_HOME}/bin:${env.PATH}"
|
PATH = "${MAVEN_HOME}/bin:${JAVA_HOME}/bin:${env.PATH}"
|
||||||
|
|
||||||
|
// 目标服务器配置
|
||||||
|
DEPLOY_SERVER = '116.62.163.84'
|
||||||
|
|
||||||
// Docker相关环境变量
|
// Docker相关环境变量
|
||||||
DOCKER_REGISTRY = 'your-registry.com'
|
|
||||||
IMAGE_NAME = 'jenkins-demo'
|
IMAGE_NAME = 'jenkins-demo'
|
||||||
IMAGE_TAG = "${BUILD_NUMBER}"
|
IMAGE_TAG = "${BUILD_NUMBER}"
|
||||||
|
|
||||||
// SonarQube配置
|
// SonarQube配置
|
||||||
SONAR_HOST_URL = 'http://your-sonar-server:9000'
|
SONAR_HOST_URL = 'http://116.62.163.84:15010'
|
||||||
SONAR_PROJECT_KEY = 'jenkins-demo'
|
SONAR_PROJECT_KEY = 'jenkins-demo'
|
||||||
|
SONAR_TOKEN = 'squ_7e4217cabd0faae6f3b8ee359b3b8e2ac52eb69a'
|
||||||
}
|
}
|
||||||
|
|
||||||
tools {
|
tools {
|
||||||
@ -91,22 +94,15 @@ pipeline {
|
|||||||
echo '🔍 运行SonarQube代码扫描...'
|
echo '🔍 运行SonarQube代码扫描...'
|
||||||
script {
|
script {
|
||||||
try {
|
try {
|
||||||
withSonarQubeEnv('SonarQube') {
|
sh '''
|
||||||
sh '''
|
mvn sonar:sonar \
|
||||||
mvn sonar:sonar \
|
-Dsonar.projectKey=${SONAR_PROJECT_KEY} \
|
||||||
-Dsonar.projectKey=${SONAR_PROJECT_KEY} \
|
-Dsonar.host.url=${SONAR_HOST_URL} \
|
||||||
-Dsonar.host.url=${SONAR_HOST_URL} \
|
-Dsonar.login=${SONAR_TOKEN} \
|
||||||
-Dsonar.coverage.jacoco.xmlReportPaths=target/site/jacoco/jacoco.xml
|
-Dsonar.coverage.jacoco.xmlReportPaths=target/site/jacoco/jacoco.xml
|
||||||
'''
|
'''
|
||||||
}
|
|
||||||
|
|
||||||
// 等待质量门检查结果
|
echo "✅ SonarQube代码扫描完成"
|
||||||
timeout(time: 5, unit: 'MINUTES') {
|
|
||||||
def qg = waitForQualityGate()
|
|
||||||
if (qg.status != 'OK') {
|
|
||||||
error "质量门检查失败: ${qg.status}"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
echo "⚠️ SonarQube扫描失败,继续构建流程: ${e.getMessage()}"
|
echo "⚠️ SonarQube扫描失败,继续构建流程: ${e.getMessage()}"
|
||||||
}
|
}
|
||||||
@ -141,7 +137,7 @@ pipeline {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
stage('推送Docker镜像') {
|
stage('传输Docker镜像到服务器') {
|
||||||
when {
|
when {
|
||||||
anyOf {
|
anyOf {
|
||||||
branch 'main'
|
branch 'main'
|
||||||
@ -150,14 +146,42 @@ pipeline {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
steps {
|
steps {
|
||||||
echo '📤 推送Docker镜像到仓库...'
|
echo '📤 传输Docker镜像到目标服务器...'
|
||||||
script {
|
script {
|
||||||
docker.withRegistry("https://${DOCKER_REGISTRY}", 'docker-registry-credentials') {
|
// 将Docker镜像保存为tar文件并传输到目标服务器
|
||||||
def image = docker.image("${IMAGE_NAME}:${IMAGE_TAG}")
|
withCredentials([usernamePassword(credentialsId: 'deploy-server-ssh', usernameVariable: 'SSH_USER', passwordVariable: 'SSH_PASS')]) {
|
||||||
image.push()
|
sh '''
|
||||||
image.push("latest")
|
# 保存Docker镜像为tar文件
|
||||||
|
docker save ${IMAGE_NAME}:${IMAGE_TAG} -o ${IMAGE_NAME}-${IMAGE_TAG}.tar
|
||||||
|
|
||||||
|
# 安装sshpass(如果未安装)
|
||||||
|
command -v sshpass >/dev/null 2>&1 || {
|
||||||
|
echo "安装sshpass..."
|
||||||
|
apt-get update && apt-get install -y sshpass || yum install -y sshpass || true
|
||||||
|
}
|
||||||
|
|
||||||
|
# 传输镜像文件到目标服务器
|
||||||
|
sshpass -p "$SSH_PASS" scp -o StrictHostKeyChecking=no ${IMAGE_NAME}-${IMAGE_TAG}.tar ${SSH_USER}@${DEPLOY_SERVER}:/tmp/
|
||||||
|
|
||||||
|
# 在目标服务器上加载镜像
|
||||||
|
sshpass -p "$SSH_PASS" ssh -o StrictHostKeyChecking=no ${SSH_USER}@${DEPLOY_SERVER} << EOF
|
||||||
|
# 加载Docker镜像
|
||||||
|
docker load -i /tmp/${IMAGE_NAME}-${IMAGE_TAG}.tar
|
||||||
|
|
||||||
|
# 创建latest标签
|
||||||
|
docker tag ${IMAGE_NAME}:${IMAGE_TAG} ${IMAGE_NAME}:latest
|
||||||
|
|
||||||
|
# 清理临时文件
|
||||||
|
rm -f /tmp/${IMAGE_NAME}-${IMAGE_TAG}.tar
|
||||||
|
|
||||||
|
echo "✅ Docker镜像加载完成"
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# 清理本地临时文件
|
||||||
|
rm -f ${IMAGE_NAME}-${IMAGE_TAG}.tar
|
||||||
|
'''
|
||||||
}
|
}
|
||||||
echo "✅ Docker镜像推送完成"
|
echo "✅ Docker镜像传输完成"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -173,9 +197,9 @@ pipeline {
|
|||||||
echo '🚀 部署到测试环境...'
|
echo '🚀 部署到测试环境...'
|
||||||
script {
|
script {
|
||||||
// 部署到测试服务器
|
// 部署到测试服务器
|
||||||
sshagent(['test-server-ssh']) {
|
withCredentials([usernamePassword(credentialsId: 'deploy-server-ssh', usernameVariable: 'SSH_USER', passwordVariable: 'SSH_PASS')]) {
|
||||||
sh '''
|
sh '''
|
||||||
ssh -o StrictHostKeyChecking=no user@test-server << EOF
|
sshpass -p "$SSH_PASS" ssh -o StrictHostKeyChecking=no ${SSH_USER}@${DEPLOY_SERVER} << EOF
|
||||||
# 停止现有容器
|
# 停止现有容器
|
||||||
docker stop jenkins-demo-test || true
|
docker stop jenkins-demo-test || true
|
||||||
docker rm jenkins-demo-test || true
|
docker rm jenkins-demo-test || true
|
||||||
@ -184,6 +208,7 @@ pipeline {
|
|||||||
docker run -d --name jenkins-demo-test \\
|
docker run -d --name jenkins-demo-test \\
|
||||||
-p 8080:8080 \\
|
-p 8080:8080 \\
|
||||||
--restart unless-stopped \\
|
--restart unless-stopped \\
|
||||||
|
-e SPRING_PROFILES_ACTIVE=test \\
|
||||||
${IMAGE_NAME}:${IMAGE_TAG}
|
${IMAGE_NAME}:${IMAGE_TAG}
|
||||||
|
|
||||||
echo "✅ 测试环境部署完成"
|
echo "✅ 测试环境部署完成"
|
||||||
@ -209,9 +234,9 @@ EOF
|
|||||||
parameters: [choice(name: 'DEPLOY_ENV', choices: ['prod'], description: '选择部署环境')]
|
parameters: [choice(name: 'DEPLOY_ENV', choices: ['prod'], description: '选择部署环境')]
|
||||||
|
|
||||||
// 部署到生产服务器
|
// 部署到生产服务器
|
||||||
sshagent(['prod-server-ssh']) {
|
withCredentials([usernamePassword(credentialsId: 'deploy-server-ssh', usernameVariable: 'SSH_USER', passwordVariable: 'SSH_PASS')]) {
|
||||||
sh '''
|
sh '''
|
||||||
ssh -o StrictHostKeyChecking=no user@prod-server << EOF
|
sshpass -p "$SSH_PASS" ssh -o StrictHostKeyChecking=no ${SSH_USER}@${DEPLOY_SERVER} << EOF
|
||||||
# 备份当前版本
|
# 备份当前版本
|
||||||
docker tag ${IMAGE_NAME}:latest ${IMAGE_NAME}:backup-$(date +%Y%m%d-%H%M%S) || true
|
docker tag ${IMAGE_NAME}:latest ${IMAGE_NAME}:backup-$(date +%Y%m%d-%H%M%S) || true
|
||||||
|
|
||||||
@ -224,8 +249,12 @@ EOF
|
|||||||
-p 80:8080 \\
|
-p 80:8080 \\
|
||||||
--restart unless-stopped \\
|
--restart unless-stopped \\
|
||||||
-e SPRING_PROFILES_ACTIVE=prod \\
|
-e SPRING_PROFILES_ACTIVE=prod \\
|
||||||
|
-e JAVA_OPTS="-Xms512m -Xmx1024m" \\
|
||||||
${IMAGE_NAME}:${IMAGE_TAG}
|
${IMAGE_NAME}:${IMAGE_TAG}
|
||||||
|
|
||||||
|
# 更新latest标签
|
||||||
|
docker tag ${IMAGE_NAME}:${IMAGE_TAG} ${IMAGE_NAME}:latest
|
||||||
|
|
||||||
echo "✅ 生产环境部署完成"
|
echo "✅ 生产环境部署完成"
|
||||||
EOF
|
EOF
|
||||||
'''
|
'''
|
||||||
@ -242,7 +271,7 @@ EOF
|
|||||||
sleep(time: 30, unit: 'SECONDS')
|
sleep(time: 30, unit: 'SECONDS')
|
||||||
|
|
||||||
// 检查应用健康状态
|
// 检查应用健康状态
|
||||||
def healthCheckUrl = "http://localhost:8080/api/health"
|
def healthCheckUrl = "http://${DEPLOY_SERVER}/api/health"
|
||||||
def response = sh(
|
def response = sh(
|
||||||
script: "curl -s -o /dev/null -w '%{http_code}' ${healthCheckUrl}",
|
script: "curl -s -o /dev/null -w '%{http_code}' ${healthCheckUrl}",
|
||||||
returnStdout: true
|
returnStdout: true
|
||||||
|
90
QUICK_START.md
Normal file
90
QUICK_START.md
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
# Jenkins快速配置清单 ✅
|
||||||
|
|
||||||
|
## 🚀 5分钟快速配置
|
||||||
|
|
||||||
|
### ✅ 第1步:安装插件
|
||||||
|
进入 **管理Jenkins** → **插件管理** → **可选插件**,搜索并安装:
|
||||||
|
```
|
||||||
|
Maven Integration Plugin
|
||||||
|
JaCoCo Plugin
|
||||||
|
SonarQube Scanner Plugin
|
||||||
|
Docker Pipeline Plugin
|
||||||
|
SSH Agent Plugin
|
||||||
|
Credentials Binding Plugin
|
||||||
|
```
|
||||||
|
|
||||||
|
### ✅ 第2步:配置工具
|
||||||
|
进入 **管理Jenkins** → **全局工具配置**:
|
||||||
|
|
||||||
|
**JDK配置:**
|
||||||
|
- 名称:`JDK-17`
|
||||||
|
- JAVA_HOME:`/usr/lib/jvm/java-17-openjdk`
|
||||||
|
|
||||||
|
**Maven配置:**
|
||||||
|
- 名称:`Maven-3.9.3`
|
||||||
|
- 勾选自动安装,选择版本3.9.3
|
||||||
|
|
||||||
|
### ✅ 第3步:配置SonarQube
|
||||||
|
进入 **管理Jenkins** → **系统配置** → **SonarQube servers**:
|
||||||
|
- 名称:`SonarQube`
|
||||||
|
- URL:`http://116.62.163.84:15010`
|
||||||
|
- Token:`squ_7e4217cabd0faae6f3b8ee359b3b8e2ac52eb69a`
|
||||||
|
|
||||||
|
### ✅ 第4步:添加凭据
|
||||||
|
进入 **管理Jenkins** → **凭据** → **添加凭据**:
|
||||||
|
|
||||||
|
**Git凭据:**
|
||||||
|
- 类型:用户名密码
|
||||||
|
- ID:`git-credentials`
|
||||||
|
- 用户名:`wangtianqi`
|
||||||
|
- 密码:[您的Git密码]
|
||||||
|
|
||||||
|
**SSH凭据:**
|
||||||
|
- 类型:用户名密码
|
||||||
|
- ID:`deploy-server-ssh`
|
||||||
|
- 用户名:`root`
|
||||||
|
- 密码:[服务器root密码]
|
||||||
|
|
||||||
|
### ✅ 第5步:创建Pipeline
|
||||||
|
1. **新建任务** → 输入名称:`java-demo-pipeline` → 选择 **Pipeline**
|
||||||
|
2. **Pipeline配置**:
|
||||||
|
- Definition:`Pipeline script from SCM`
|
||||||
|
- SCM:`Git`
|
||||||
|
- Repository URL:`http://116.62.163.84:15006/wangtianqi/java_demo.git`
|
||||||
|
- Credentials:选择 `git-credentials`
|
||||||
|
- Branch:`*/main`
|
||||||
|
- Script Path:`Jenkinsfile`
|
||||||
|
|
||||||
|
### ✅ 第6步:立即构建
|
||||||
|
点击 **立即构建**,等待构建完成!
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 验证部署
|
||||||
|
|
||||||
|
**生产环境:**
|
||||||
|
```bash
|
||||||
|
curl http://116.62.163.84/api/health
|
||||||
|
```
|
||||||
|
|
||||||
|
**测试环境:**
|
||||||
|
```bash
|
||||||
|
curl http://116.62.163.84:8080/api/health
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚡ 常用操作
|
||||||
|
|
||||||
|
**查看构建日志:** 构建详情页 → 控制台输出
|
||||||
|
**查看测试报告:** 构建详情页 → 测试结果
|
||||||
|
**查看代码覆盖率:** 构建详情页 → JaCoCo代码覆盖率
|
||||||
|
**查看代码质量:** 访问 `http://116.62.163.84:15010`
|
||||||
|
|
||||||
|
**重新构建:** 项目主页 → 立即构建
|
||||||
|
**清理工作空间:** 项目主页 → 工作空间 → 清理工作空间
|
||||||
|
**查看Pipeline:** 安装Blue Ocean插件后点击 "Open Blue Ocean"
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
🎉 **配置完成!享受您的CI/CD之旅!**
|
265
server-setup-simple.sh
Normal file
265
server-setup-simple.sh
Normal file
@ -0,0 +1,265 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# 目标服务器配置脚本 (简化版 - 支持用户名密码)
|
||||||
|
# 在 116.62.163.84 服务器上运行
|
||||||
|
|
||||||
|
echo "🚀 开始配置Jenkins部署目标服务器..."
|
||||||
|
|
||||||
|
# 更新系统
|
||||||
|
echo "📦 更新系统包..."
|
||||||
|
yum update -y || apt update -y
|
||||||
|
|
||||||
|
# 检查Docker是否已安装
|
||||||
|
if command -v docker &> /dev/null; then
|
||||||
|
echo "✅ Docker已安装"
|
||||||
|
docker --version
|
||||||
|
else
|
||||||
|
echo "❌ 请先安装Docker"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 启动Docker服务
|
||||||
|
echo "🐳 启动Docker服务..."
|
||||||
|
systemctl start docker
|
||||||
|
systemctl enable docker
|
||||||
|
|
||||||
|
# 创建应用目录
|
||||||
|
echo "📁 创建应用目录..."
|
||||||
|
mkdir -p /opt/jenkins-demo
|
||||||
|
mkdir -p /opt/jenkins-demo/logs
|
||||||
|
mkdir -p /opt/jenkins-demo/backup
|
||||||
|
|
||||||
|
# 设置防火墙规则
|
||||||
|
echo "🔥 配置防火墙规则..."
|
||||||
|
if command -v firewall-cmd &> /dev/null; then
|
||||||
|
# CentOS/RHEL
|
||||||
|
firewall-cmd --permanent --add-port=80/tcp
|
||||||
|
firewall-cmd --permanent --add-port=8080/tcp
|
||||||
|
firewall-cmd --reload
|
||||||
|
elif command -v ufw &> /dev/null; then
|
||||||
|
# Ubuntu
|
||||||
|
ufw allow 80/tcp
|
||||||
|
ufw allow 8080/tcp
|
||||||
|
ufw --force enable
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 配置SSH(如果使用密码认证)
|
||||||
|
echo "🔐 配置SSH..."
|
||||||
|
# 确保SSH服务运行
|
||||||
|
systemctl start sshd
|
||||||
|
systemctl enable sshd
|
||||||
|
|
||||||
|
# 如果需要启用密码认证(不推荐生产环境)
|
||||||
|
# sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config
|
||||||
|
# systemctl restart sshd
|
||||||
|
|
||||||
|
# 创建部署脚本
|
||||||
|
echo "📝 创建部署脚本..."
|
||||||
|
cat > /opt/jenkins-demo/deploy-local.sh << 'EOF'
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# 本地部署脚本
|
||||||
|
APP_NAME="jenkins-demo"
|
||||||
|
CONTAINER_NAME_PROD="jenkins-demo-prod"
|
||||||
|
CONTAINER_NAME_TEST="jenkins-demo-test"
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
"prod")
|
||||||
|
echo "🎯 部署生产环境..."
|
||||||
|
docker stop $CONTAINER_NAME_PROD || true
|
||||||
|
docker rm $CONTAINER_NAME_PROD || true
|
||||||
|
|
||||||
|
docker run -d --name $CONTAINER_NAME_PROD \
|
||||||
|
-p 80:8080 \
|
||||||
|
--restart unless-stopped \
|
||||||
|
-e SPRING_PROFILES_ACTIVE=prod \
|
||||||
|
-e JAVA_OPTS="-Xms512m -Xmx1024m" \
|
||||||
|
-v /opt/jenkins-demo/logs:/app/logs \
|
||||||
|
$APP_NAME:latest
|
||||||
|
echo "✅ 生产环境部署完成"
|
||||||
|
;;
|
||||||
|
"test")
|
||||||
|
echo "🧪 部署测试环境..."
|
||||||
|
docker stop $CONTAINER_NAME_TEST || true
|
||||||
|
docker rm $CONTAINER_NAME_TEST || true
|
||||||
|
|
||||||
|
docker run -d --name $CONTAINER_NAME_TEST \
|
||||||
|
-p 8080:8080 \
|
||||||
|
--restart unless-stopped \
|
||||||
|
-e SPRING_PROFILES_ACTIVE=test \
|
||||||
|
-v /opt/jenkins-demo/logs:/app/logs \
|
||||||
|
$APP_NAME:latest
|
||||||
|
echo "✅ 测试环境部署完成"
|
||||||
|
;;
|
||||||
|
"status")
|
||||||
|
echo "📊 应用状态:"
|
||||||
|
docker ps -a --filter name=jenkins-demo
|
||||||
|
;;
|
||||||
|
"logs")
|
||||||
|
echo "📄 应用日志:"
|
||||||
|
docker logs -f ${2:-jenkins-demo-prod}
|
||||||
|
;;
|
||||||
|
"backup")
|
||||||
|
echo "💾 备份当前版本..."
|
||||||
|
BACKUP_TAG="backup-$(date +%Y%m%d-%H%M%S)"
|
||||||
|
docker tag $APP_NAME:latest $APP_NAME:$BACKUP_TAG
|
||||||
|
echo "✅ 备份完成: $APP_NAME:$BACKUP_TAG"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "用法: $0 {prod|test|status|logs|backup}"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
EOF
|
||||||
|
|
||||||
|
chmod +x /opt/jenkins-demo/deploy-local.sh
|
||||||
|
|
||||||
|
# 创建健康检查脚本
|
||||||
|
cat > /opt/jenkins-demo/health-check.sh << 'EOF'
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# 健康检查脚本
|
||||||
|
PROD_URL="http://localhost/api/health"
|
||||||
|
TEST_URL="http://localhost:8080/api/health"
|
||||||
|
|
||||||
|
echo "🏥 执行应用健康检查..."
|
||||||
|
|
||||||
|
echo "检查生产环境:"
|
||||||
|
curl -s -o /dev/null -w "状态码: %{http_code}\n" $PROD_URL || echo "生产环境无响应"
|
||||||
|
|
||||||
|
echo "检查测试环境:"
|
||||||
|
curl -s -o /dev/null -w "状态码: %{http_code}\n" $TEST_URL || echo "测试环境无响应"
|
||||||
|
|
||||||
|
echo "Docker容器状态:"
|
||||||
|
docker ps --filter name=jenkins-demo --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
|
||||||
|
EOF
|
||||||
|
|
||||||
|
chmod +x /opt/jenkins-demo/health-check.sh
|
||||||
|
|
||||||
|
# 创建清理脚本
|
||||||
|
cat > /opt/jenkins-demo/cleanup.sh << 'EOF'
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
echo "🧹 清理Docker资源..."
|
||||||
|
|
||||||
|
# 清理停止的容器
|
||||||
|
docker container prune -f
|
||||||
|
|
||||||
|
# 清理未使用的镜像
|
||||||
|
docker image prune -f
|
||||||
|
|
||||||
|
# 清理未使用的网络
|
||||||
|
docker network prune -f
|
||||||
|
|
||||||
|
# 清理未使用的卷
|
||||||
|
docker volume prune -f
|
||||||
|
|
||||||
|
# 显示磁盘使用情况
|
||||||
|
echo "💾 磁盘使用情况:"
|
||||||
|
df -h /
|
||||||
|
|
||||||
|
echo "🐳 Docker磁盘使用情况:"
|
||||||
|
docker system df
|
||||||
|
|
||||||
|
echo "✅ 清理完成"
|
||||||
|
EOF
|
||||||
|
|
||||||
|
chmod +x /opt/jenkins-demo/cleanup.sh
|
||||||
|
|
||||||
|
# 设置定时清理任务
|
||||||
|
echo "⏰ 设置定时清理任务..."
|
||||||
|
(crontab -l 2>/dev/null; echo "0 2 * * 0 /opt/jenkins-demo/cleanup.sh >> /var/log/docker-cleanup.log 2>&1") | crontab -
|
||||||
|
|
||||||
|
# 创建监控脚本
|
||||||
|
cat > /opt/jenkins-demo/monitor.sh << 'EOF'
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# 应用监控脚本
|
||||||
|
LOG_FILE="/var/log/jenkins-demo-monitor.log"
|
||||||
|
|
||||||
|
# 记录日志
|
||||||
|
log() {
|
||||||
|
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> $LOG_FILE
|
||||||
|
}
|
||||||
|
|
||||||
|
# 检查容器是否运行
|
||||||
|
check_container() {
|
||||||
|
local container_name=$1
|
||||||
|
if docker ps --filter name=$container_name --filter status=running -q | grep -q .; then
|
||||||
|
log "✅ $container_name 运行正常"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
log "❌ $container_name 未运行"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# 检查应用健康状态
|
||||||
|
check_health() {
|
||||||
|
local url=$1
|
||||||
|
local name=$2
|
||||||
|
local status=$(curl -s -o /dev/null -w "%{http_code}" $url)
|
||||||
|
if [ "$status" = "200" ]; then
|
||||||
|
log "✅ $name 健康检查通过"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
log "❌ $name 健康检查失败,状态码: $status"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# 主监控逻辑
|
||||||
|
main() {
|
||||||
|
log "🔍 开始监控检查..."
|
||||||
|
|
||||||
|
# 检查生产环境
|
||||||
|
if check_container "jenkins-demo-prod"; then
|
||||||
|
check_health "http://localhost/api/health" "生产环境"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 检查测试环境
|
||||||
|
if check_container "jenkins-demo-test"; then
|
||||||
|
check_health "http://localhost:8080/api/health" "测试环境"
|
||||||
|
fi
|
||||||
|
|
||||||
|
log "✅ 监控检查完成"
|
||||||
|
}
|
||||||
|
|
||||||
|
main
|
||||||
|
EOF
|
||||||
|
|
||||||
|
chmod +x /opt/jenkins-demo/monitor.sh
|
||||||
|
|
||||||
|
# 设置监控定时任务
|
||||||
|
echo "📊 设置监控定时任务..."
|
||||||
|
(crontab -l 2>/dev/null; echo "*/5 * * * * /opt/jenkins-demo/monitor.sh") | crontab -
|
||||||
|
|
||||||
|
# 显示服务器信息
|
||||||
|
echo ""
|
||||||
|
echo "🎉 服务器配置完成!"
|
||||||
|
echo ""
|
||||||
|
echo "📋 服务器信息:"
|
||||||
|
echo "IP地址: $(hostname -I | awk '{print $1}')"
|
||||||
|
echo "操作系统: $(cat /etc/os-release | grep PRETTY_NAME | cut -d'=' -f2 | tr -d '\"')"
|
||||||
|
echo "Docker版本: $(docker --version)"
|
||||||
|
echo ""
|
||||||
|
echo "📁 应用目录: /opt/jenkins-demo"
|
||||||
|
echo "📄 日志目录: /opt/jenkins-demo/logs"
|
||||||
|
echo "💾 备份目录: /opt/jenkins-demo/backup"
|
||||||
|
echo ""
|
||||||
|
echo "🔧 可用脚本:"
|
||||||
|
echo " 部署脚本: /opt/jenkins-demo/deploy-local.sh"
|
||||||
|
echo " 健康检查: /opt/jenkins-demo/health-check.sh"
|
||||||
|
echo " 清理脚本: /opt/jenkins-demo/cleanup.sh"
|
||||||
|
echo " 监控脚本: /opt/jenkins-demo/monitor.sh"
|
||||||
|
echo ""
|
||||||
|
echo "🌐 访问地址:"
|
||||||
|
echo " 生产环境: http://$(hostname -I | awk '{print $1}')/api/health"
|
||||||
|
echo " 测试环境: http://$(hostname -I | awk '{print $1}'):8080/api/health"
|
||||||
|
echo ""
|
||||||
|
echo "💡 使用提示:"
|
||||||
|
echo " sudo /opt/jenkins-demo/deploy-local.sh prod # 部署生产环境"
|
||||||
|
echo " sudo /opt/jenkins-demo/deploy-local.sh test # 部署测试环境"
|
||||||
|
echo " sudo /opt/jenkins-demo/health-check.sh # 健康检查"
|
||||||
|
echo " sudo /opt/jenkins-demo/cleanup.sh # 清理资源"
|
||||||
|
echo ""
|
168
server-setup.sh
Normal file
168
server-setup.sh
Normal file
@ -0,0 +1,168 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Jenkins Demo 目标服务器配置脚本
|
||||||
|
# 运行环境:116.62.163.84
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo "🚀 开始配置Jenkins Demo部署环境..."
|
||||||
|
|
||||||
|
# 1. 更新系统
|
||||||
|
echo "📦 更新系统包..."
|
||||||
|
yum update -y
|
||||||
|
|
||||||
|
# 2. 安装必要工具
|
||||||
|
echo "🔧 安装必要工具..."
|
||||||
|
yum install -y curl wget git
|
||||||
|
|
||||||
|
# 3. 配置Docker(假设已安装)
|
||||||
|
echo "🐳 配置Docker..."
|
||||||
|
systemctl enable docker
|
||||||
|
systemctl start docker
|
||||||
|
|
||||||
|
# 4. 创建应用目录
|
||||||
|
echo "📁 创建应用目录..."
|
||||||
|
mkdir -p /opt/jenkins-demo
|
||||||
|
mkdir -p /opt/jenkins-demo/logs
|
||||||
|
mkdir -p /opt/jenkins-demo/backup
|
||||||
|
|
||||||
|
# 5. 创建日志目录
|
||||||
|
echo "📋 创建日志目录..."
|
||||||
|
mkdir -p /var/log/jenkins-demo
|
||||||
|
chmod 755 /var/log/jenkins-demo
|
||||||
|
|
||||||
|
# 6. 配置防火墙(如果需要)
|
||||||
|
echo "🔥 配置防火墙..."
|
||||||
|
# 开放应用端口
|
||||||
|
firewall-cmd --permanent --add-port=80/tcp || true
|
||||||
|
firewall-cmd --permanent --add-port=8080/tcp || true
|
||||||
|
firewall-cmd --reload || true
|
||||||
|
|
||||||
|
# 7. 创建应用用户(可选,增强安全性)
|
||||||
|
echo "👤 创建应用用户..."
|
||||||
|
useradd -r -s /bin/false -d /opt/jenkins-demo jenkins-demo || true
|
||||||
|
chown -R jenkins-demo:jenkins-demo /opt/jenkins-demo || true
|
||||||
|
chown -R jenkins-demo:jenkins-demo /var/log/jenkins-demo || true
|
||||||
|
|
||||||
|
# 8. 配置Docker用户权限
|
||||||
|
echo "🔐 配置Docker权限..."
|
||||||
|
usermod -aG docker jenkins-demo || true
|
||||||
|
|
||||||
|
# 9. 创建部署脚本
|
||||||
|
echo "📜 创建部署脚本..."
|
||||||
|
cat > /opt/jenkins-demo/deploy.sh << 'EOF'
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# 应用部署脚本
|
||||||
|
APP_NAME="jenkins-demo"
|
||||||
|
CONTAINER_NAME="jenkins-demo-prod"
|
||||||
|
IMAGE_TAG="${1:-latest}"
|
||||||
|
|
||||||
|
echo "🚀 开始部署 ${APP_NAME}:${IMAGE_TAG}"
|
||||||
|
|
||||||
|
# 停止现有容器
|
||||||
|
echo "⏹️ 停止现有容器..."
|
||||||
|
docker stop ${CONTAINER_NAME} 2>/dev/null || true
|
||||||
|
docker rm ${CONTAINER_NAME} 2>/dev/null || true
|
||||||
|
|
||||||
|
# 备份当前镜像
|
||||||
|
echo "💾 备份当前镜像..."
|
||||||
|
docker tag ${APP_NAME}:latest ${APP_NAME}:backup-$(date +%Y%m%d-%H%M%S) 2>/dev/null || true
|
||||||
|
|
||||||
|
# 运行新容器
|
||||||
|
echo "🏃 启动新容器..."
|
||||||
|
docker run -d \
|
||||||
|
--name ${CONTAINER_NAME} \
|
||||||
|
--restart unless-stopped \
|
||||||
|
-p 80:8080 \
|
||||||
|
-e SPRING_PROFILES_ACTIVE=prod \
|
||||||
|
-e JAVA_OPTS="-Xms512m -Xmx1024m" \
|
||||||
|
-v /var/log/jenkins-demo:/app/logs \
|
||||||
|
--health-cmd="curl -f http://localhost:8080/api/health || exit 1" \
|
||||||
|
--health-interval=30s \
|
||||||
|
--health-timeout=10s \
|
||||||
|
--health-retries=3 \
|
||||||
|
--health-start-period=60s \
|
||||||
|
${APP_NAME}:${IMAGE_TAG}
|
||||||
|
|
||||||
|
echo "✅ 部署完成!"
|
||||||
|
echo "🌐 应用访问地址: http://116.62.163.84"
|
||||||
|
echo "🏥 健康检查: http://116.62.163.84/api/health"
|
||||||
|
EOF
|
||||||
|
|
||||||
|
chmod +x /opt/jenkins-demo/deploy.sh
|
||||||
|
|
||||||
|
# 10. 创建清理脚本
|
||||||
|
echo "🧹 创建清理脚本..."
|
||||||
|
cat > /opt/jenkins-demo/cleanup.sh << 'EOF'
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
echo "🧹 开始清理Docker资源..."
|
||||||
|
|
||||||
|
# 删除停止的容器
|
||||||
|
docker container prune -f
|
||||||
|
|
||||||
|
# 删除未使用的镜像
|
||||||
|
docker image prune -f
|
||||||
|
|
||||||
|
# 删除旧的备份镜像(保留最近5个)
|
||||||
|
echo "🗑️ 清理旧备份镜像..."
|
||||||
|
docker images jenkins-demo --format "table {{.Repository}}:{{.Tag}}" | \
|
||||||
|
grep "backup-" | tail -n +6 | xargs -r docker rmi
|
||||||
|
|
||||||
|
echo "✅ 清理完成!"
|
||||||
|
EOF
|
||||||
|
|
||||||
|
chmod +x /opt/jenkins-demo/cleanup.sh
|
||||||
|
|
||||||
|
# 11. 设置定时清理任务
|
||||||
|
echo "⏰ 设置定时清理任务..."
|
||||||
|
(crontab -l 2>/dev/null; echo "0 2 * * 0 /opt/jenkins-demo/cleanup.sh >> /var/log/jenkins-demo/cleanup.log 2>&1") | crontab -
|
||||||
|
|
||||||
|
# 12. 创建监控脚本
|
||||||
|
echo "📊 创建监控脚本..."
|
||||||
|
cat > /opt/jenkins-demo/monitor.sh << 'EOF'
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
APP_NAME="jenkins-demo-prod"
|
||||||
|
HEALTH_URL="http://localhost/api/health"
|
||||||
|
|
||||||
|
# 检查容器状态
|
||||||
|
if ! docker ps | grep -q ${APP_NAME}; then
|
||||||
|
echo "❌ 容器 ${APP_NAME} 未运行"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 检查健康状态
|
||||||
|
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" ${HEALTH_URL})
|
||||||
|
if [ "$HTTP_CODE" != "200" ]; then
|
||||||
|
echo "❌ 应用健康检查失败,HTTP状态码: ${HTTP_CODE}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "✅ 应用运行正常"
|
||||||
|
EOF
|
||||||
|
|
||||||
|
chmod +x /opt/jenkins-demo/monitor.sh
|
||||||
|
|
||||||
|
# 13. 显示配置摘要
|
||||||
|
echo "
|
||||||
|
🎉 服务器配置完成!
|
||||||
|
|
||||||
|
📁 应用目录: /opt/jenkins-demo
|
||||||
|
📋 日志目录: /var/log/jenkins-demo
|
||||||
|
🚀 部署脚本: /opt/jenkins-demo/deploy.sh
|
||||||
|
🧹 清理脚本: /opt/jenkins-demo/cleanup.sh
|
||||||
|
📊 监控脚本: /opt/jenkins-demo/monitor.sh
|
||||||
|
|
||||||
|
🔧 下一步操作:
|
||||||
|
1. 在Jenkins中配置SSH密钥
|
||||||
|
2. 测试SSH连接:ssh root@116.62.163.84
|
||||||
|
3. 运行第一次部署
|
||||||
|
|
||||||
|
📝 常用命令:
|
||||||
|
- 部署应用: /opt/jenkins-demo/deploy.sh [版本号]
|
||||||
|
- 检查状态: /opt/jenkins-demo/monitor.sh
|
||||||
|
- 查看日志: docker logs jenkins-demo-prod
|
||||||
|
- 清理资源: /opt/jenkins-demo/cleanup.sh
|
||||||
|
"
|
Loading…
x
Reference in New Issue
Block a user