一、项目概述
本项目将在已经部署好的高可用 Web 集群 + ELK 日志系统基础上,搭建一套完整的 Jenkins 持续集成 / 持续部署流水线,实现代码从 Git 提交到自动部署到生产环境的全流程自动化。
这是运维工程师求职的核心加分项,几乎所有互联网公司都要求掌握 Jenkins 自动化部署技能。
项目架构图:
开发者 | v Git代码仓库 | v Jenkins服务器 | | v v 代码拉取 → 代码编译 → 代码质量检查 → 自动化测试 → 打包构建 → 自动部署 | v Nginx+Tomcat高可用集群 | v ELK日志分析系统项目亮点:
- 与之前的高可用 Web 集群无缝对接
- 实现代码提交后自动触发部署
- 支持版本回滚,一键回退到任意历史版本
- 集成 Maven 自动化构建
二、虚拟机规划与硬件要求
新增 1 台虚拟机:
| 主机名 | IP 地址 | 操作系统 | CPU | 内存 | 硬盘 | 角色 |
|---|---|---|---|---|---|---|
| jenkins | 192.168.176.143 | CentOS 7.9 | 2 核 | 3GB | 40GB | Jenkins+Maven+Git |
总硬件要求:物理机 CPU≥16 核,内存≥24GB,硬盘≥280GB。如果内存不足,可以暂时关闭 ELK 集群,只保留 Jenkins 和 Web 集群。
三、环境准备(jenkins 节点执行)
1. 关闭防火墙和 SELinux
systemctl stop firewalld systemctl disable firewalld setenforce 0 sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config2. 配置主机名和 hosts 文件
hostnamectl set-hostname jenkins cat >> /etc/hosts << EOF 192.168.176.133 ha1 192.168.176.134 ha2 192.168.176.135 nginx1 192.168.176.136 nginx2 192.168.176.137 tomcat1 192.168.176.138 tomcat2 192.168.176.143 jenkins EOF3. 配置时间同步
yum install -y ntpdate ntpdate ntp.aliyun.com echo "*/30 * * * * /usr/sbin/ntpdate ntp.aliyun.com >> /var/log/ntpdate.log 2>&1" | crontab -4. 安装 JDK 21
wget https://download.oracle.com/java/21/latest/jdk-21_linux-x64_bin.tar.gz tar -zxvf jdk-21_linux-x64_bin.tar.gz -C /usr/local/ mv /usr/local/jdk-21.0.11 /usr/local/jdk cat >> /etc/profile << EOF export JAVA_HOME=/usr/local/jdk export JRE_HOME=\$JAVA_HOME/jre export CLASSPATH=.:\$JAVA_HOME/lib:\$JRE_HOME/lib export PATH=\$PATH:\$JAVA_HOME/bin EOF source /etc/profile java -version5. 安装 Maven 3.9.6
wget https://mirrors.huaweicloud.com/apache/maven/maven-3/3.9.6/binaries/apache-maven-3.9.6-bin.tar.gz tar -zxvf apache-maven-3.9.6-bin.tar.gz -C /usr/local/ mv /usr/local/apache-maven-3.9.6 /usr/local/maven # 更新环境变量 cat >> /etc/profile << EOF export MAVEN_HOME=/usr/local/maven export PATH=\$PATH:\$MAVEN_HOME/bin EOF source /etc/profile mvn -v6. 配置 Maven 阿里云镜像
# 1. 备份默认配置文件 mv /usr/local/maven/conf/settings.xml /usr/local/maven/conf/settings.xml.bak # 2. 创建新的配置文件(直接复制整个命令执行) cat > /usr/local/maven/conf/settings.xml << EOF <?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <!-- 本地仓库目录,存放下载的依赖包 --> <localRepository>/usr/local/maven/repository</localRepository> <!-- 阿里云镜像,优先使用 --> <mirrors> <mirror> <id>aliyunmaven</id> <mirrorOf>central</mirrorOf> <name>阿里云中央仓库</name> <url>https://maven.aliyun.com/repository/public</url> </mirror> </mirrors> <!-- 全局JDK 11配置 --> <profiles> <profile> <id>jdk-11</id> <activation> <activeByDefault>true</activeByDefault> <jdk>11</jdk> </activation> <properties> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> <maven.compiler.encoding>UTF-8</maven.compiler.encoding> </properties> </profile> </profiles> </settings> EOF # 3. 创建本地仓库目录 mkdir -p /usr/local/maven/repository # 4. 设置目录权限 chown -R root:root /usr/local/maven7. 安装 Git
yum install -y git git --version四、详细部署步骤
第一部分:安装 Jenkins
1. 下载 Jenkins 2.504.2
wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/war-stable/2.504.2/jenkins.war /usr/local/2. 启动 Jenkins
# 后台启动Jenkins,端口8080 nohup java -jar /usr/local/jenkins.war --httpPort=8080 & # 等待1-2分钟,查看启动日志 tail -f nohup.out3. 获取初始管理员密码
cat /root/.jenkins/secrets/initialAdminPassword4. 访问 Jenkins Web 界面
打开浏览器访问:http://你的ip:8080
- 输入上面获取的初始密码
- 选择 "安装推荐的插件"
- 创建管理员用户
- 完成初始化
如果出现插件安装失败
第一步:先点击 "继续" 跳过插件安装
直接点击页面右下角的继续按钮,先进入 Jenkins 主界面。跳过插件安装不会影响 Jenkins 的基本功能,我们后面再手动安装需要的插件。
第二步:替换 Jenkins 插件源为清华大学镜像源
这是最根本的解决方案,替换后插件下载速度会从几 KB/s 变成几 MB/s。
1. 停止 Jenkins 进程
# 找到Jenkins进程ID ps aux | grep jenkins | grep -v grep | awk '{print $2}' | xargs kill -92. 一键替换镜像源脚本
直接复制执行下面的命令,自动替换所有相关配置:
# 进入Jenkins主目录 cd /root/.jenkins # 备份原配置文件 cp hudson.model.UpdateCenter.xml hudson.model.UpdateCenter.xml.bak # 替换为清华大学镜像源 sed -i 's|https://updates.jenkins.io/update-center.json|https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json|g' hudson.model.UpdateCenter.xml # 替换插件下载地址 sed -i 's|https://updates.jenkins.io/download|https://mirrors.tuna.tsinghua.edu.cn/jenkins|g' updates/default.json3. 重启 Jenkins
nohup java -jar /usr/local/jenkins.war --httpPort=8080 & # 等待1分钟,查看启动日志 tail -f nohup.out第三步:重新安装必要插件
现在重新访问 Jenkins 界面:http://你的ip:8080
1. 进入插件管理页面
- 左侧菜单 → 系统管理 → 插件管理
- 点击 "高级" 选项卡
- 拉到最下面,点击 "立即获取",更新插件列表
2. 只安装你需要的必要插件
不需要安装所有推荐插件,只需要安装以下几个核心插件即可完成自动化部署:
- Git plugin:Git 代码管理
- Maven Integration plugin:Maven 构建支持
- SSH plugin:SSH 远程执行命令
- Pipeline:流水线支持(可选)
- Localization: Chinese (Simplified):中文语言包
3. 安装方法
- 在 "可选插件" 中搜索上面的插件名称
- 勾选需要安装的插件
- 点击 "安装无需重启"
- 等待安装完成
第四步:如果还是有问题,终极解决方案:手动上传插件
如果个别插件还是下载失败,可以手动下载插件文件,然后上传安装:
1. 清华大学 Jenkins 插件下载地址
https://mirrors.tuna.tsinghua.edu.cn/jenkins/plugins/
2. 安装方法
- 在上面的地址中找到你需要的插件,下载
.hpi文件 - 进入 Jenkins → 系统管理 → 插件管理 → 高级
- 拉到最下面的 "上传插件" 部分
- 选择下载好的
.hpi文件,点击 "上传"
第二部分:配置 Jenkins 全局工具
- 进入 Jenkins → 系统管理 → 全局工具配置
- 配置 JDK:
- 别名:JDK
- JAVA_HOME:
/usr/local/jdk
- 配置 Maven:
- 别名:Maven
- MAVEN_HOME:
/usr/local/maven
- 配置 Git:
- 别名:Git
- Path to Git executable:
/usr/bin/git
- 点击 "保存"
第三部分:配置 Jenkins 免密登录到 Tomcat 节点
Jenkins 需要通过 SSH 将打包好的 war 包部署到 Tomcat 服务器,所以需要配置免密登录。
1. 在 Jenkins 服务器生成 SSH 密钥对
ssh-keygen -t rsa # 连续按三次回车,使用默认配置2. 将公钥复制到 Tomcat 节点
ssh-copy-id root@192.168.176.137 # 输入Tomcat节点的root密码3. 测试免密登录
ssh root@192.168.176.137 # 不需要输入密码就能登录,说明配置成功第四部分:创建第一个自动化部署任务
1. 准备测试代码
在 Git 上创建一个简单的 Java Web 项目,或者使用我提供的测试代码:
# 在Jenkins服务器上创建测试项目 mkdir -p /data/test-project/src/main/webapp/WEB-INF # 创建index.jsp cat > /data/test-project/src/main/webapp/index.jsp << EOF <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <title>Jenkins自动化部署测试</title> </head> <body> <h1>Jenkins自动化部署成功!</h1> <p>部署时间:<%= new java.util.Date() %></p> <p>服务器IP:<%= request.getLocalAddr() %></p> </body> </html> EOF # 创建web.xml cat > /data/test-project/src/main/webapp/WEB-INF/web.xml << EOF <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> </web-app> EOF # 创建pom.xml cat > /data/test-project/pom.xml << EOF <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>test-project</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <build> <finalName>test</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.3.1</version> </plugin> </plugins> </build> </project> EOF登录到 Jenkins 服务器,执行以下命令:
# 1. 进入项目目录 cd /data/test-project # 2. 查看是否有.git文件夹(正常应该有,没有就是没初始化成功) ls -la | grep .git # 3. 如果没有.git文件夹,重新初始化 git init # 4. 配置Git用户信息 git config --global user.name "admin" git config --global user.email "admin@example.com" # 5. 添加所有文件并提交 git add . git commit -m "初始提交:创建测试项目" # 6. 验证Git仓库是否正常 git status2. 在 Jenkins 中创建自由风格项目
- 点击 "新建任务"
- 输入任务名称:
test-project-deploy - 选择 "自由风格的软件项目"
- 点击 "确定"
3. 配置源码管理
- 选择 "Git"
- Repository URL:
file:///data/test-project(本地 Git 仓库,测试用) - 分支:
*/master
4. 配置构建触发器
- 勾选 "Poll SCM"
- 日程表:
* * * * *(每分钟检查一次代码变化,有变化自动构建)
5. 配置构建步骤
- 点击 "增加构建步骤" → "调用顶层 Maven 目标"
- Maven 版本:选择你配置的 Maven3.9.6
- 目标:
clean package -Dmaven.test.skip=true
6. 配置部署步骤
- 点击 "增加构建步骤" → "执行 shell"
- 输入以下脚本:
#!/bin/bash # 部署脚本 # 定义变量 TOMCAT_IP="192.168.176.136" #注意ip TOMCAT_HOME="/usr/local/tomcat" WAR_NAME="test.war" WAR_PATH="/root/.jenkins/workspace/test-project-deploy/target/${WAR_NAME}" # 1. 停止Tomcat ssh root@${TOMCAT_IP} "${TOMCAT_HOME}/bin/shutdown.sh" sleep 5 # 2. 删除旧的war包和解压目录 ssh root@${TOMCAT_IP} "rm -rf ${TOMCAT_HOME}/webapps/${WAR_NAME} ${TOMCAT_HOME}/webapps/test" # 3. 上传新的war包 scp ${WAR_PATH} root@${TOMCAT_IP}:${TOMCAT_HOME}/webapps/ # 4. 启动Tomcat ssh root@${TOMCAT_IP} "${TOMCAT_HOME}/bin/startup.sh" sleep 10 # 5. 验证部署是否成功 if curl -s http://${TOMCAT_IP}:8080/test/ | grep "Jenkins自动化部署成功"; then echo "部署成功!" exit 0 else echo "部署失败!" exit 1 fi7. 保存并构建
- 点击 "保存"
- 点击 "立即构建"
- 查看构建历史,点击控制台输出,查看构建过程
如果出现构建失败,是因为这是 Jenkins 2.400 + 版本新增的安全机制,默认禁止从本地文件系统的 Git 仓库拉取代码,防止恶意代码通过本地文件系统攻击 Jenkins 服务器
解决方案一:临时允许本地检出(推荐测试环境使用)
第一步:停止 Jenkins 进程
ps aux | grep jenkins | grep -v grep | awk '{print $2}' | xargs kill -9第二步:添加启动参数允许本地 Git 检出
# 启动时添加系统属性参数 nohup java -Xms2g -Xmx2g -Dhudson.plugins.git.GitSCM.ALLOW_LOCAL_CHECKOUT=true -jar /usr/local/jenkins.war --httpPort=8080 &第三步:重新构建任务
等待 Jenkins 启动完成后,回到 Jenkins 界面,点击 "立即构建",这次就可以正常拉取代码了。
解决方案二:使用远程 Git 仓库(生产环境推荐)
在生产环境中,强烈建议使用远程 Git 仓库(如 Gitee、GitHub 或 GitLab),而不是本地仓库。你可以在 Gitee 上创建一个免费的私有仓库,然后将代码推送到远程仓库,再在 Jenkins 中配置远程仓库地址。
操作步骤:
- 在 Gitee 上创建一个私有仓库
- 将本地代码推送到远程仓库:
cd /data/test-project git remote add origin https://gitee.com/你的用户名/test-project.git git push -u origin master - 在 Jenkins 中配置远程仓库地址:
https://gitee.com/你的用户名/test-project.git - 配置 Gitee 的用户名和密码凭证
控制台输入为绿色成功
验证部署结果
构建完成后,访问 Tomcat 服务器的测试页面:
http://192.168.176.136:8080/test/