diff --git a/JENKINS-SETUP.md b/JENKINS-SETUP.md new file mode 100644 index 0000000..ceba23a --- /dev/null +++ b/JENKINS-SETUP.md @@ -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流程了!** diff --git a/JENKINS_PANEL_GUIDE.md b/JENKINS_PANEL_GUIDE.md new file mode 100644 index 0000000..d4a180c --- /dev/null +++ b/JENKINS_PANEL_GUIDE.md @@ -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工作流程了!🚀 diff --git a/JENKINS_PASSWORD_SETUP.md b/JENKINS_PASSWORD_SETUP.md new file mode 100644 index 0000000..24d0a78 --- /dev/null +++ b/JENKINS_PASSWORD_SETUP.md @@ -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 diff --git a/JENKINS_SETUP.md b/JENKINS_SETUP.md new file mode 100644 index 0000000..82ff6bb --- /dev/null +++ b/JENKINS_SETUP.md @@ -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容器化部署,确保环境一致性 diff --git a/Jenkinsfile b/Jenkinsfile index 5652df3..0165d34 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -12,14 +12,17 @@ pipeline { MAVEN_HOME = '/opt/maven' PATH = "${MAVEN_HOME}/bin:${JAVA_HOME}/bin:${env.PATH}" + // 目标服务器配置 + DEPLOY_SERVER = '116.62.163.84' + // Docker相关环境变量 - DOCKER_REGISTRY = 'your-registry.com' IMAGE_NAME = 'jenkins-demo' IMAGE_TAG = "${BUILD_NUMBER}" // SonarQube配置 - SONAR_HOST_URL = 'http://your-sonar-server:9000' + SONAR_HOST_URL = 'http://116.62.163.84:15010' SONAR_PROJECT_KEY = 'jenkins-demo' + SONAR_TOKEN = 'squ_7e4217cabd0faae6f3b8ee359b3b8e2ac52eb69a' } tools { @@ -91,22 +94,15 @@ pipeline { echo '🔍 运行SonarQube代码扫描...' script { try { - withSonarQubeEnv('SonarQube') { - sh ''' - mvn sonar:sonar \ - -Dsonar.projectKey=${SONAR_PROJECT_KEY} \ - -Dsonar.host.url=${SONAR_HOST_URL} \ - -Dsonar.coverage.jacoco.xmlReportPaths=target/site/jacoco/jacoco.xml - ''' - } + sh ''' + mvn sonar:sonar \ + -Dsonar.projectKey=${SONAR_PROJECT_KEY} \ + -Dsonar.host.url=${SONAR_HOST_URL} \ + -Dsonar.login=${SONAR_TOKEN} \ + -Dsonar.coverage.jacoco.xmlReportPaths=target/site/jacoco/jacoco.xml + ''' - // 等待质量门检查结果 - timeout(time: 5, unit: 'MINUTES') { - def qg = waitForQualityGate() - if (qg.status != 'OK') { - error "质量门检查失败: ${qg.status}" - } - } + echo "✅ SonarQube代码扫描完成" } catch (Exception e) { echo "⚠️ SonarQube扫描失败,继续构建流程: ${e.getMessage()}" } @@ -141,7 +137,7 @@ pipeline { } } - stage('推送Docker镜像') { + stage('传输Docker镜像到服务器') { when { anyOf { branch 'main' @@ -150,14 +146,42 @@ pipeline { } } steps { - echo '📤 推送Docker镜像到仓库...' + echo '📤 传输Docker镜像到目标服务器...' script { - docker.withRegistry("https://${DOCKER_REGISTRY}", 'docker-registry-credentials') { - def image = docker.image("${IMAGE_NAME}:${IMAGE_TAG}") - image.push() - image.push("latest") + // 将Docker镜像保存为tar文件并传输到目标服务器 + withCredentials([usernamePassword(credentialsId: 'deploy-server-ssh', usernameVariable: 'SSH_USER', passwordVariable: 'SSH_PASS')]) { + sh ''' + # 保存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 '🚀 部署到测试环境...' script { // 部署到测试服务器 - sshagent(['test-server-ssh']) { + withCredentials([usernamePassword(credentialsId: 'deploy-server-ssh', usernameVariable: 'SSH_USER', passwordVariable: 'SSH_PASS')]) { 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 rm jenkins-demo-test || true @@ -184,6 +208,7 @@ pipeline { docker run -d --name jenkins-demo-test \\ -p 8080:8080 \\ --restart unless-stopped \\ + -e SPRING_PROFILES_ACTIVE=test \\ ${IMAGE_NAME}:${IMAGE_TAG} echo "✅ 测试环境部署完成" @@ -209,9 +234,9 @@ EOF 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 ''' - 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 @@ -224,8 +249,12 @@ EOF -p 80:8080 \\ --restart unless-stopped \\ -e SPRING_PROFILES_ACTIVE=prod \\ + -e JAVA_OPTS="-Xms512m -Xmx1024m" \\ ${IMAGE_NAME}:${IMAGE_TAG} + # 更新latest标签 + docker tag ${IMAGE_NAME}:${IMAGE_TAG} ${IMAGE_NAME}:latest + echo "✅ 生产环境部署完成" EOF ''' @@ -242,7 +271,7 @@ EOF sleep(time: 30, unit: 'SECONDS') // 检查应用健康状态 - def healthCheckUrl = "http://localhost:8080/api/health" + def healthCheckUrl = "http://${DEPLOY_SERVER}/api/health" def response = sh( script: "curl -s -o /dev/null -w '%{http_code}' ${healthCheckUrl}", returnStdout: true diff --git a/QUICK_START.md b/QUICK_START.md new file mode 100644 index 0000000..ad46cc2 --- /dev/null +++ b/QUICK_START.md @@ -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之旅!** diff --git a/server-setup-simple.sh b/server-setup-simple.sh new file mode 100644 index 0000000..0151065 --- /dev/null +++ b/server-setup-simple.sh @@ -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 "" diff --git a/server-setup.sh b/server-setup.sh new file mode 100644 index 0000000..e43fe06 --- /dev/null +++ b/server-setup.sh @@ -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 +"