实现一键发布SpringBoot项目,解放你的双手
每次发版都需要大量重复的操作,虽然不难,但是很累,既然我们是写程序的,那么有没有方法能一键发布,傻瓜式部署呢,今天就带大家一起学习下。
文章目录
一、发布一个SprongBoot项目的流程
-
利用maven将项目打成jar包
-
将jar包上传到服务器指定目录
mkdir -p /usr/data/java/demo mv demo-0.0.1-SNAPSHOT.jar demo.jar
在服务器端创建存放jar文件目录,然后将jar包重命名下方便操作。(其实可以在maven打包时候设置打包名称,在boot项目的pom.xml配置即可)
-
启动Java即可
nohup java -jar demo.jar >/dev/null 2>&1&
我们思考下这样是否完善?第一次这么操作肯定没问题,第二次发布,我们进行到第三步的时候项目肯定启动不起来,因为端口号占用,所以我们还需要在第三步之前加入一个杀掉之前进程的一个操作
-
杀掉之前进程(第三步之前)
首先,我们查看之前的boot进程是否存在,存在 kill -9 进程id,不存在跳过
ps aux | grep demo.jar kill -9 1051
二、利用Jenkins实现一键发布
利用Jenkins能极大地简化我们发布流程,我们在编写完代码后,提交git,然后在Jenkins的操作页面点击构建即可。但是这种方式有两个前提,一个是服务器搭建Jenkins服务,一个是代码必须托管(git或者svn)
1. Jenkins发布前提条件
搭建Jenkins服务,具体搭建过程以及第四点的maven插件参考我的博客: 从零开始搭建Jenkins(文末有常用插件下载链接),有帮助到大家希望给个赞。
-
Jenkins配置Maven
-
Jenkins所在的服务器必须有Java服务
-
Jenkins安装Maven插件
2. Jenkins发布配置
-
创建maven任务
-
git配置(代码来源)
关联git,这里我选择将代码托管到gitee上,然后添加你gitee账号和密码,下面指定git分支
alt=“pic” style=“margin: auto;”/>
-
maven打包命令
clean install -Dmaven.test.skip -U
-
构建后的shell命令
#!/bin/bash #export BUILD_ID=dontKillMe这一句很重要,这样指定了,项目启动之后才不会被Jenkins杀掉。 export BUILD_ID=dontKillMe #Jenkins中编译好的jar名称 jar_name=demo.jar #指定最后编译好的jar存放的位置 www_path=/usr/data/java/demo/ #存放pid文件位置 pid_path=/usr/data/java/demo/demo.pid #Jenkins中编译好的jar位置 jar_path=/root/.jenkins/workspace/${JOB_BASE_NAME}/target/ #获取运行编译好的进程ID,便于我们在重新部署项目的时候先杀掉以前的进程 pid=$(cat ${pid_path}) #进入指定的编译好的jar的位置 cd ${jar_path} #将编译好的jar复制到最后指定的位置 cp ${jar_path}/${jar_name} ${www_path} #进入最后指定存放jar的位置 cd ${www_path} #杀掉以前可能启动的项目进程 kill -9 ${pid} #启动jar,,后台启动 java -jar ./${jar_name} >/dev/null 2>&1& #将进程ID存入到demo.pid文件中 echo $! > ${pid_path}
shell脚本需要修改三个地方
#Jenkins中编译好的jar名称 jar_name=demo.jar #指定最后编译好的jar存放的位置 www_path=/usr/data/java/demo/ #存放pid文件位置 pid_path=/usr/data/java/demo/demo.pid
-
点击保存,然后在jar包存在目录的平级创建一个 后缀为pid文件记录当前启动boot项目的进程
touch demo.pid
-
点击构建即可
首次构建时候第4步shell脚本中 kill -9 ${pid} 这一步骤 注释掉 在
kill
前面 添加#
号,kill一个空的pid会报错,导致后面无法执行,有知道解决方案小伙伴可以评论区评论。第一次构建完后,会将项目的进程号写入该文件,然后将shell脚本的 kill -9 ${pid} 的注释去掉。第一次构建需要下载依赖文件比较慢,maven的setting.xml可以配置阿里镜像。
3. Jenkins部署测试
我们最终实现的效果是,写完代码–>Git提交–>Jenkins点击构建
-
首先我们将修改的SpringBoot项目打包名称修改下。
-
我们在SpringBoot里面新增个接口用来测试
/** * @Author weiweisong * @Classname HelloController * @Description 控制层 * @Date 2021/2/24 9:57 */ @RestController public class HelloController { @GetMapping("/hello") public String hello() { return "张三"; } }
-
git 提交 推送
-
点击构建(第一次kill 注释掉),浏览器查看效果
-
然后修改代码,再次提交推送,然后构建(
记得把kill 注释解开
),最后查看效果
三、使用Alibaba Cloud Toolkit
插件一键发布
这个是我目前在使用的方式,Jenkins虽然强大,但是有种杀鸡焉用牛刀的感觉,实际上我们只需要将jar包上传到服务器上然后执行一些命令就可以了。下面将演示使用插件实现一键发布。
1. 下载插件
2. 配置服务器信息
3. 添加运行环境
-
服务器准备
demo.pid
文件进入jar包存放目录,建立 后缀为
.pid
文件,该文件存的是项目的进程id。 -
服务器上编写
start.sh
文件vim start.sh
将下面内容复制到文件里面
# 存放的位置 www_path=/usr/data/java/demo #Jenkins中编译好的jar名称 jar_name=demo.jar #pid位置 pid_path=/usr/data/java/demo/demo.pid #获取运行编译好的进程ID,便于我们在重新部署项目的时候先杀掉以前的进程 pid=$(cat ${pid_path}) #进入最后指定存放jar的位置 cd ${www_path} #杀掉以前可能启动的项目进程,第一次构建将下面这行注释掉 kill -9 ${pid} #启动jar,指定SpringBoot的profiles为test,后台启动 nohup java -jar ${jar_name} >/dev/null 2>&1& #将进程ID存入到shaw-web.pid文件中 echo $! > ${pid_path}
-
然后回到idea,点击运行按钮
敲黑板!!! 第一次部署将第5步中,kill 命令那行注释掉,之后在解开就可以
4. 插件部署测试
-
修改代码
return "王五";
,点击运行 -
控制台
-
效果
四、部署比较
其实无论Jenkins发布和插件发布,得看自己的需求,Jenkins发布的好处是不需要任何ide,只需要将代码推送到git上,无论使用记事本还是浏览器上修改代码,最终推送到git上就可以打包,还有就是搭建好Jenkins后可以让领导发布,体现领导的价值~~~,我是喜欢插件部署,因为目前部署比较简单,比较轻,而且插件部署还可以部署到不同服务器上,另外采取Jenkins只能部署在Jenkins所在的服务器上,局限性太大了。
五、最后的话
上面演示的是单体SpringBoot的部署,每次部署都会将所有的依赖都打进去,我们可以将依赖的包单独放在服务器上,启动项目时候 指定下目录就可以,下次出个教程,当然还有前端vue的部署。如果帮到了你,希望点个赞支持一波。