侧边栏壁纸
博主头像
一朵云的博客博主等级

拥抱生活,向阳而生。

  • 累计撰写 67 篇文章
  • 累计创建 25 个标签
  • 累计收到 7 条评论

目 录CONTENT

文章目录

Jenkins -- 自动化部署基于SpringBoot的项目

一朵云
2021-01-12 / 0 评论 / 13 点赞 / 7544 阅读 / 10746 字

背景

  就我个人而言,工作这三年时间内遇到的项目,基本都没有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任务

  • 构建自由风格的项目
    image.png

  • 添加描述信息,便于后续管理
    image.png

  • 添加git仓库地址并配置私钥
    image.png

  • 添加构建日志的时间组件
    image.png

  • 新增并填写shell脚本
    image.png

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

image.png

测试jenkins手动一键部署,部署成功最后 cat 项目启动日志出来

image.png

image.png

image.png

6、添加git代码提交监控

  • Jenkins安装插件Gitee Plugin
    image.png

  • 对Jenkins任务进行配置
    image.png

image.png

  • 前往Gitee项目 – 管理 – WebHooks – 添加
    image.png

7、触发Jenkins任务构建就发送邮件通知

  • qq邮箱为例,获取smtp信息
    image.png

  • 安装邮件拓展插件
    image.png

  • 系统配置 – 邮箱配置Extended E-mail Notification
    image.png

  • 配置构建任务中的发送邮件
    image.png

测试:尝试提交代码到git的mater分支,查看是否自动构建?

  • 未修改提交项目前,接口内容如下:
    image.png

  • 修改接口商品信息后提交mater分支,查看是否触发自动构建。
    image.png

  • 查看jenkins构建历史,可以看出已经触发了自动部署,再次访问接口,发现内容已经发生改变,成功了!
    image.png

  • 查看邮箱是否收到邮件通知
    image.png

image.png

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构建结果显示为失败)
    image.png

坑:

  • 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]不能写为if[? = 0 ]不能写为if [? = 0]。
13

评论区