一、Jenkins部署SpringBoot项目
设备:MacOS
准备工作
1.已安装java开发工具包JDK
2.已安装依赖管理工具Maven
3.已安装代码版本控制工具Git
4.已安装Jenkins
learn-moon代码地址:https://github.com/BillDavidup/learn-moon
SSH: git@github.com:BillDavidup/learn-moon.git
HTTP: https://github.com/BillDavidup/learn-moon.git
详细步骤
1.安装插件
打开Jenkins页面,浏览器输入http://localhost:8080/
第一次打开使用cat命令读取秘钥文件中的秘钥cat /var/root/.jenkins/secrets/initialAdminPassword
,权限不够则用sudo cat /var/root/.jenkins/secrets/initialAdminPassword
,填入管理员密码,点击继续
选择安装推荐的插件
来安装,安装后检查必须需要安装再安装,再手动必须安装的插件有Maven Integration、GitHub plugin或Gitlab或gitee(选择用到的)
创建一个用户
为了避免端口占用,还可以修改Jenkins地址的端口,这里就默认用http://localhost:8080/
保存后来到欢迎页
选择Manage Jenkins->Manage Plugins->可选插件,搜索框输入需要安装的插件
github插件已安装,如果用的是gitlab,则需要安装gitlab插件,项目存在github中,所以只安装了github。提示:GitLab/GitLab Plugin和Gitlab Hook/Gitlab Hook Plugin 两个插件安装 有些jenkins版本可能这两个插件都在GitLab/GitLab Plugin中,所以只需要安装这一个插件即可。
2.全局插件配置
Manage Jenkins->Global Tool Configuration
2.1 Maven设置setting.xml文件
2.2 JDK设置
MacOS:查看JDK安装路径的命令是/usr/libexec/java_home -V
2.3 Git设置/usr/bin/git
这里是MacOS系统的安装文件git文件
如果是Windows: 则配置为git的安装目录下的git.bash文件全路径名
如果是Linux: 跟MacOS类似,找到具体的文件全路径
2.4 配置Maven的Home目录(Home目录的意思就是包含/bin的上一次文件夹)
3.新建一个视图和部署任务
3.1 新建视图
视图用于区分应用分组,比如测试环境(test)、预发环境(pre)、线上环境(prod)
新建了一个learn-test视图
在learn-test视图下新建一个部署任务(item)
新建了一个learn-moon项目的dev环境部署任务learn-moon-dev
3.2 配置git仓库
配置项目learn-moon的ssh地址,因为Jenkins需要拉取github上面的learn-moon项目代码,在Jenkins中配置该项目的SSH地址即可
配置Credentials项的私钥
张贴私钥,给私钥随意取了一个testPrivateKey
名字
Credentials选择刚才添加的私钥选项testPrivateKey
选择对哪个分支进行构建,默认是master,可以根据不同环境选择不同的代码分支
3.3 maven设置
Pre Steps在构建项目之前需要做的操作,比如执行shell的脚本,如果没有,则不需要选择
设置maven的build命令clean install -Dmaven.test.skip=true
忽略测试类,勾选Add timestamps to the Console Output之后Jenkins会将构建项目的日志输出在Jenkins的控制台
Post Steps即在bulid项目之后需要做的操作,比如执行shell脚本,不需要的话就不选择
因为我们部署的是SpringBoot服务,需要在构建完成后启动服务,选择Run only if build succeeds
(仅在构建成功时运行) -> Execute shell(执行shell)
配置的执行shell脚本内容如下:
#!/bin/bash
# 关闭已启动的应用
AppJar=learn-moon-web-1.0-SNAPSHOT.jar
PID=$(ps -ef | grep $AppJar | grep -v grep | awk '{ print $2 }')
if [ ${PID} ];
then
echo 'Application is stopping...'
echo kill $PID DONE
kill -9 $PID
else
echo 'Application is already stopped...'
fi
# 启动服务
## 将jenkins从仓库拉取到的代码构建后的jar包移动到/Users/wudening/project/目录下,所有需要提前创建好该目录
## 如果不清楚Jenkins打包后的jar包路径,可以先不写,等执行任务后查看构建的jar包输出目录
mv /Users/wudening/.jenkins/workspace/learn-moon_dev/learn-moon-web/target/$AppJar /Users/wudening/project/$AppJar
## 进入到复制好jar的目录
cd /Users/wudening/project/
## 后台执行启动服务命令,且分配JVM内存;BUILD_ID=dontKillMe的作用是构建完成避免关闭进程和子进程,造成服务启动无效
BUILD_ID=dontKillMe nohup java -Xms512m -Xmx512m -jar $AppJar &
#备份应用
backupSubString=$(date +%Y%m%d%H%M)
cp $AppJar $AppJar-$backupSubString
echo "backup jar success!"
如果脚本内容比较多,那么可以在服务器上创建一个脚本(learn-moon-start.sh),将以上脚本内容写在一个文件里,然后赋予脚本执行权限,那么在Jenkins中只要执行对应的脚本即可,建议用绝对路径,例:sh /Users/wudening/project/learn-moon/learn-moon-start.sh
3.4 构建后如果想触发邮件
3.5 jenkins执行构建并验证服务是否启动
浏览器中访问learn-moon的http接口进行验证http://localhost:9092/api/alive
接上,查看Jenkins打包的路径
Build History 构建历史记录->控制台输出
4.实现分支(master)提交代码后触发Jenkins自动部署服务(learn-moon)
参考:https://blog.csdn.net/m0_67403013/article/details/126790479
问题:一般在生产环境中,部署jenkins的服务和项目的服务不在同一台机器上,这就需要再脚本中通过SSH登录目标服务器部署,还需要利用SCP命令将jenkins构建的应用jar包拷贝到目标服务器上;
- 如果是远程则用SSH登录账号(需要安装
Publish Over SSH和Infrastructure plugin for Publish Over XVersion
插件);用到的命令SSH
和SCP
- 部署脚本可以放在目标服务器的文件夹下,在配置jenkins的Execute shell脚本中引用该进行部署