通过 Jenkins、Maven 和 Git 的整合,可以构建一套高效的自动化部署流水线。其核心流程如下:

- 首先,开发人员将本地代码
git push 到远程 GitLab 服务器。
- 然后,Jenkins 从仓库
git pull 拉取代码,并使用 Maven 将其构建成可执行的 jar 包。
- 最后,Jenkins 通过 SSH Publisher 插件将构建产物发布到目标服务器并启动应用。
一、环境准备
本文演示需要三台独立的服务器,分别承担代码仓库、持续集成和运行环境角色。
服务器信息如下:
| 服务器名 |
IP地址 |
配置 |
安装软件 |
| gitlab99 |
192.168.40.99 |
8C8G |
GitLab |
| jenkins98 |
192.168.40.98 |
4C4G |
Jenkins, JDK, Maven, Git |
| test97 |
192.168.40.97 |
2C2G |
JDK |
注:GitLab与Jenkins的安装过程可参考相关文档,本文不再赘述。
二、GitLab项目配置
1. 创建空白项目
首先,在GitLab中创建一个用于存放代码的空白项目。
- 进入“Groups”页面,点击“New group”创建一个新分组。
- 在新建的分组内,点击“New project”,选择“Create blank project”创建空白项目。
- 输入项目名称(如
jenkins-study),完成创建。
2. 生成访问令牌(Token)
为了能让Jenkins安全地拉取代码,需要在GitLab中生成一个访问令牌。
- 点击页面左上角头像,进入“Settings” -> “Access Tokens”。
- 填写令牌名称,勾选
api和read_repository等必要权限,点击“Create personal access token”。
- 妥善保存生成的Token字符串(例如
glpat-qx7VU3J219j1D4_92uqJ),关闭页面后将无法再次查看。
三、开发与提交SpringBoot应用
1. 创建SpringBoot项目
使用IDEA或任意IDE创建一个简单的SpringBoot Web项目。
2. 关联并推送代码至GitLab
- 在IDEA中配置Git可执行文件路径(
Settings -> Version Control -> Git)。
- 将当前项目初始化为Git仓库(
VCS -> Create Git Repository)。
- 添加远程仓库地址(
Git -> Manage Remotes),URL填写之前创建的GitLab项目克隆地址。
- 推送代码时,身份验证选择“Token”,填入在GitLab生成的个人访问令牌。
- 完成首次提交与推送后,在GitLab的Web界面合并代码至主分支。
四、Jenkins流水线配置
1. 安装必要插件
进入Jenkins的插件管理页面,安装以下插件:
- Maven Integration:使Jenkins支持Maven项目。
- Publish Over SSH:用于通过SSH向远程服务器传输文件并执行命令。
2. 创建并配置Maven项目
- 在Jenkins首页点击“新建Item”,选择“构建一个Maven项目”,命名为
first。
- 源码管理:选择“Git”,填写GitLab仓库的URL,并添加凭据(用户名填写任意值,密码填写GitLab Token)。
- 分支:指定要构建的分支,例如
*/main。
- Build:在“Root POM”处保持默认的
pom.xml,Goals填写 clean package。
- 在Jenkins全局工具配置中(
Manage Jenkins -> Tools),指定Maven的安装路径。
3. 测试构建
保存配置后,立即触发一次构建。在构建日志中,可以观察到Maven打包的过程。构建成功后,可以在Jenkins服务器的工作空间目录(如 /root/.jenkins/workspace/first/target/)找到生成的 jar 包。可在此目录下执行 java -jar 命令进行本地运行测试。
常见问题:若运行jar包时提示“no main manifest attribute”,需检查项目的 pom.xml,确保 spring-boot-maven-plugin 的 skip 配置为 false。
4. 配置SSH服务器与文件发布
- 添加远程服务器:进入
Manage Jenkins -> Configure System,找到“Publish over SSH”区域,添加SSH Server。填写测试服务器(test97)的IP、SSH用户名和密码或密钥,并通过“Test Configuration”测试连接是否成功。
- 配置构建后操作:在项目配置页面,找到“Post Steps”部分,选择“Send files or execute commands over SSH”。
5. 优化:构建前清理环境
为避免多次部署时旧进程和文件造成冲突,需要在每次构建前清理测试服务器环境。
在测试服务器(test97)上创建清理脚本 /root/clean.sh:
#!/bin/bash
appname=$1
if [ -z $appname ];
then
echo "应用名称不能为空!"
exit -1
else
echo "应用名称为$1"
fi
rm -rf $appname/"${appname}"*.jar
pid=`ps -ef | grep $1 | grep 'java -jar' | awk '{printf $2}'`
echo "pid为$pid"
if [ -z $pid ];
then
echo "$appname is not started"
else
kill -9 $pid
echo "$appname was stopped"
fi
赋予脚本执行权限:chmod +x /root/clean.sh。
在Jenkins项目配置的“Pre Steps”中,增加一个“Execute shell script on remote host using ssh”步骤:
SSH Server:选择之前配置的test97服务器。
Command:填写 /root/clean.sh jenkins-study。
6. 完整流程测试
保存所有配置,再次触发Jenkins构建。观察控制台输出,可以看到完整的流程:清理旧环境 -> 拉取代码 -> Maven打包 -> 传输Jar包 -> 启动新应用。最后,访问测试服务器地址 http://192.168.40.97:8088,验证应用是否成功部署并运行。
五、总结与思考
通过以上步骤,我们实现了一个基础的Jenkins CI/CD流水线,涵盖了从代码提交到自动部署的全过程。但这只是一个起点,一个成熟的生产级流水线还需要考虑更多因素,例如:
- 多环境管理:如何区分开发、测试、生产环境的配置与部署。
- 流水线即代码:使用Jenkinsfile将流水线配置纳入版本控制。
- 自动化测试集成:在构建阶段加入单元测试、集成测试。
- 镜像化部署:结合Docker,实现更高效、一致的环境交付。
- 监控与回滚:部署后的健康检查、日志收集和快速回滚机制。
通过持续优化部署流程,可以显著提升软件交付的效率与可靠性,这正是DevOps实践的核心价值所在。
|