背景
就我个人而言,工作这三年时间内遇到的项目,基本都没有war包或单独部署在Tomcat的项目了。原因不言而喻,SpringBoot内嵌了Tomcat服务,项目内引入springboot-web的maven依赖,就可以直接启动了,真是方便大家的框架呢。
目标
- 搭建一个基于Java的SpringBoot项目;
- 使用Gitee版本管理工具管理代码;
- 使用Jenkins进行手动初次部署;
- 编写基于Maven的shell脚本文件;
- 完善Jenkins配置,结合上述流程,做到一键部署。
- 补充代码提交git就触发自动部署的监控器。
- 补充邮件通知配置,构建就发通知。
- 优化beanshell处理逻辑,脚本异常立即停止
实现
1、写个简易的SpringBoot项目并提交到gitee。
不想写的朋友也可以直接fork我的到你自己的仓库去用。
https://gitee.com/a_cloud/mintsdk/tree/develop
2、linux环境安装Git,并通过ssh私钥与Gitee仓库联通。
具体可参考我之前的文章:Jenkins – 安装配置及配套环境搭建
3、新建Jenkins任务
-
构建自由风格的项目
-
添加描述信息,便于后续管理
-
添加git仓库地址并配置私钥
-
添加构建日志的时间组件
-
新增并填写shell脚本
4、基于部署流程,编写Shell脚本,放在jenkins任务工作空间中。
该任务的工作空间路径为:/var/lib/jenkins/workspace/SpringBootTest,需要先构建一次才会出现。
#!/usr/bin/env bash
# 1、查进程,有则杀,无则输出提示
killJavaProcess()
{
pid=`ps -ef|grep java|grep mintsdk|awk '{print $2}'`
echo "mintsdk PId list :$pid"
if [ "$pid" = "" ]
then
echo "no mintsdk pid alive!"
else
kill -9 $pid
echo "kill pid success!"
fi
}
#删除之前的maven生成的target文件夹
rm -rf $PROJ_PATH/target
cd $PROJ_PATH
mvn clean install
#调用之前封装的方法杀掉java进程
killJavaProcess
# 判断是否有history文件夹,没有则创建,用于存储jar包的备份
if [ ! -d "$PROJ_PATH/history" ]; then
mkdir $PROJ_PATH/history
fi
# 备份刚通过maven install出来的jar包
cp $PROJ_PATH/target/mintsdk-0.0.1-SNAPSHOT.jar $PROJ_PATH/history/mintsdk-0.0.1-SNAPSHOT_`date +%y%m%d%H%M%S`.jar.bak
# 执行java的启动指令
nohup java -jar $PROJ_PATH/target/mintsdk-0.0.1-SNAPSHOT.jar > $PROJ_PATH/boot.log 2>&1 &
# 打印项目的启动日志
cat $PROJ_PATH/boot.log
将上述脚本内容写成 rebuild.sh 文件放在"/var/lib/jenkins/workspace/SpringBootTest"工作空间下面。
5、完善Jenkins中shell脚本内容
# jenkins默认在build结束后会kill掉所有的衍生进程,填写该配置可避免
BUILD_ID=DONTKILLME
# 重新加载配置参数
. /etc/profile
# 获取git拉取代码后存放的路径
export PROJ_PATH=`pwd`
# 执行自定义的shell脚本
sh $PROJ_PATH/rebuild.sh
测试jenkins手动一键部署,部署成功最后 cat 项目启动日志出来
6、添加git代码提交监控
-
Jenkins安装插件Gitee Plugin
-
对Jenkins任务进行配置
- 前往Gitee项目 – 管理 – WebHooks – 添加
7、触发Jenkins任务构建就发送邮件通知
-
qq邮箱为例,获取smtp信息
-
安装邮件拓展插件
-
系统配置 – 邮箱配置Extended E-mail Notification
-
配置构建任务中的发送邮件
测试:尝试提交代码到git的mater分支,查看是否自动构建?
-
未修改提交项目前,接口内容如下:
-
修改接口商品信息后提交mater分支,查看是否触发自动构建。
-
查看jenkins构建历史,可以看出已经触发了自动部署,再次访问接口,发现内容已经发生改变,成功了!
-
查看邮箱是否收到邮件通知
8、将Jenkins的结果与BeanShell脚本关联
两种方案结合:
- 方案1:jenkins通过推出代码的0和1判断是否成功,我们可以手动修改(推荐嵌入自动化测试时,从测试报告中提取判断)
# 从测试报告中提取测试结果
grep -c "<failure>true</failure>" *.jtl
# $? 是上一个程序执行是否成功的标志,0为成功,表示测试不通过,exit 1退出。
if [ $? = 0 ]
then
exit 1
else
exit 0
fi
- 方案2:将BeanShell脚本中的sh rebuild.sh的指令改为source rebuild.sh。(如mvn出错、kill进程失败都会让jenkins构建结果显示为失败)
坑:
- mvn command not found:
jenkins用户与root用户有区别,maven、tomcat等环境不要放在 root的~目录下,否则无法读取。建议直接安装在/var/lib下,与jenkins保持一致。
- No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?
maven环境install项目需要jre。
之前如果仅通过 yum install java 安装了jdk1.8的,还需要再执行如下指令: yum install java-1.8.0-openjdk-devel
- Linux Shell语法中空格敏感 ,如:
变量a=1不能写为a = 1;
if [ ? = 0]。
评论区