参考跳转链接:
http://ju.outofmemory.cn/entry/29263
大量的有关持续集成的书籍与文档中,基本都提到了持续部署这个步骤,然而具体怎么实现,并没有通行的做法,对于典型的Java Web应用来说,大致有两个思路,一是通过web容器(如Tomcat、JBoss)提供的接口部署,这方面的代表就是Cargo,然而,其缺点是配置复杂且不够稳定,我的经验是,部署了很多次之后,容器的JVM就会内存溢出,当然这个和具体容器有关,部署多少次之后才溢出,也要看Web应用的大小。
第二种初看起来会更复杂的做法是自己写Shell脚本来停止容器、更新Web应用、然后再启动容器,其实,如果你懂点Shell,这种方法非常简单,而且这种方法非常稳定,因为每次直接杀JVM进程,直接避免了内存溢出的问题。以下是具体的步骤,以Jenkins和Tomcat为例:
1. 配置Jenkins的Build Job在完成之后Archive war文件备用
这样每次Build完之后,到对应的Job,如:http://10.12.136.115:8080/job/fileserver/lastSuccessfulBuild/artifact/my-app/target/my-app.war。
另一种方法是直接让Jenkins Build完了之后直接deploy到Nexus,之后就可以直接从Nexus获取了,细节这里就不解释了。
2. 编写部署脚本并测试
脚本的基本思路就是,看有没有容器在运行,如果有就kill掉,然后从Jenkins/Nexus下载最新的war文件,替换掉旧的,再启动容器,如:
#!/bin/bashexport JAVA_HOME=/usr/java
tomcat_pid=`/usr/sbin/lsof -n -P -t -i :9009`[-n "$tomcat_pid"]&& kill -9 $tomcat_pid
cd /home/admin/
mv myapp.war myapp.war.bak
wget http://10.12.136.115:8080/job/fileserver/lastSuccessfulBuild/artifact/my-app/target/my-app.war
rm /home/admin/apache-tomcat-7.0.40/webapps/myapp.war
rm -fr /home/admin/apache-tomcat-7.0.40/webapps/myapp
cp myapp.war /home/admin/apache-tomcat-7.0.40/webapps/myapp.war
cd /home/admin/apache-tomcat-7.0.40/bin/./startup.sh
为什么要export JAVA_HOME环境变量稍后解释。这里的的lsof命令根据tomcat监听的端口来获取其进程ID然后杀掉,其他命令基本一目了然。在部署机器上运行该脚本确保其能工作,然后提交到源码仓库里。
3. 建一个Jenkins Job专门做部署
建一个freestyle的Job,然后scm等配置也照常,当然,部署脚本要在scm仓库中,然后Jenkins的Build配置像这样:
这条命令就是通过ssh远程登陆到部署机器上运行部署部署脚本deploy.sh,-x参数让shell打印每一行执行的命令,-s则表示从标准输入读取要运行的脚本,这里重定向了我们的deploy.sh。(如何设置ssh key实现免密码登陆请自理)
需要注意的是,这种远程执行脚本的方式,属于非交互式Shell,不会触发诸如~/.bash_profile之类文件的载入,这也是我为什么在Shell脚本中export JAVA_HOME,这个环境变量本来是在~/.bash_profile中的,当然,你也可以直接source整个~/.bash_profile。
最后,你可以通过Jenkins的Pipeline,使得当my-app Build成功之后,自动触发deploy这个任务,做到自动持续。
如果有多个应用,按照类似的方法创建多个Jenkins Job就可以了,由于Shell脚本是自己写的,不论什么容器都OK,有所放弃的是,由于要重启容器,相比直接通过容器接口部署,会稍微耗时些,但考虑到稳定性的大幅提高及配置的简化,我觉得还是值得的。
相关推荐
放在Post Steps 的shell命令 ,一键自动部署(2021最新版)
很多团队表示,我们一定要把系统全部coding完成,才向(类)生产环境部署系统,这样有一个好处,就是大家更加专注于coding。不被打扰。但是也有一个坏处,就是无法及时反馈出系统中的问题,你的boss也无法知道系统究竟...
jenkins实现maven项目自动部署到tomcat 实现自动部署,
docker+jenkins+github实现golang项目自动部署.rar
不甘寂寞的Jenkins:从持续集成到持续部署
jenkins+maven+svn+tomcat 持续集成环境快捷部署,实现自动编译打包部署
Jenkins+Docker 实现一键自动化部署项目.docx
基于Jenkins+Git实现SpringBoot项目自动部署
jenkins离线部署套装(你需要的它都有)
包含NodePort,HostPort,ClusterIp几种方式自动化部署脚本。
项目基本结构是SpringBoot,集成了docker-maven插件实现build完的镜像上传到私服,然后用 Jenkins构建实现docker集群一键自动化部署
Gitllab+Jenkins+Docker+Harbor 自动化部署流程
基于Jenkins+Gitlab+Docker实现SpringBoot项目自动部署
使用 Jenkins和容器解决之前测试环境需要测试人员按照文档全手工命令行部署,流程复杂易出错,上线部署流程不透明且不易控制的问题; 使用Jenkins和容器解决实际工作中的环境差异,统一版本; 使用Kubernetes和...
Jenkins持续集成系统部署文档
适用于大部分公司的集成部署架构图,大家可以参考下的根据自己情况进行修改的。 只是给各位参考下的,需要根据公司的集成情况进行设计。
NULL 博文链接:https://jiuyuehe.iteye.com/blog/1843103
Jenkins 自动化部署Deploy插件
Jenkins+Gradle实现android开发持续集成
Jenkins自动部署Shell脚本分享(注意,仅用于Shell脚本分享,因环境不同,不可用于其它环境自动部署使用) #!/bin/bash #时间:2019年7月29日 #作者:肖山 #微信:helpxiaoshan #用途:用于 XXXX UAT环境ATG商城项目...