原网址: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/bash
export 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,有所放弃的是,由于要重启容器,相比直接通过容器接口部署,会稍微耗时些,但考虑到稳定性的大幅提高及配置的简化,我觉得还是值得的。

转载于:https://www.cnblogs.com/yunkong/articles/4413673.html

Jenkins加Shell实现最简单的持续部署相关推荐

  1. 持续集成部署Jenkins工作笔记0001---持续集成、持续部署、持续交付的概念

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152

  2. jenkins执行shell文件_jenkins执行shell加载环境变量

    1. jenkins执行shell默认参数为bash -xe,先了解下面基础知识 1.1 什么是交互式shell(interactive shell)和非交互式shell(non-interactiv ...

  3. 【测试开发】的Devops持续集成部署体系之Jenkins持续集成和持续部署基础应用

    目录 [一]:Jenkins 持续集成安装及使用简介 一.前言 二.初始化 Jenkins 插件和管理员用户 2.1 进入如下页面,输入上面出现的口令 2.2 进入选择安装插件的页面后,可以选择安装社 ...

  4. 持续集成/持续部署(3)Jenkins(2)

    JenkinsPipeline CI/CD持续集成/持续部署 持续集成(Continuous integration)是一种软件开发实践,即团队开发成员经常集成它们的工作,通过每个成员每天至少集成一次 ...

  5. jenkins实现持续集成、持续部署

    jenkins实现持续集成.持续部署 一.分析我们需要做什么才能实现持续集成.部署 1.分析jenkins需要帮我们做哪些内容 2.拆分需要实现的步骤 二.配置持续集成和部署 0.前置条件 1.实现第 ...

  6. SpringBoot+Docker+Git+Jenkins实现简易的持续集成和持续部署

    前言 本篇文章引导你使用Jenkins部署[SpringBoot项目],同时使用Docker和Git实现简单的持续集成和持续部署.(项目地址:sso-merryyou) 流程图如下: push代码到G ...

  7. 【简书 DC谢老师】JMeter + jenkins + SVN 接口自动化之简单 demo​​​​​​​

    JMeter工具基础知识篇-工程目录结构及命名规范 如果没有目录结构及命名规范,你压根没法实现自动化的持续集成工作,你将被局限在工具级别的自动化上面,离测试框架或测试平台平台之路遥遥无期. 如果你想成 ...

  8. 自动加域脚本,bat和vbs配合使用,使加域操作更简单

    我的实验:编写自动加域脚本(总结) 1.自动加域脚本的目的. A.减少重复繁杂的必要操作,提高工作效率. B.使加域操作更简单,更有乐趣. 2.自动加域的实现方式,分为三个步骤. A.使用bat和vb ...

  9. 【敏捷开发】jenkins「CI持续集成 CD持续部署」

    文章目录 前言 一.安装jenkins 1. 部署中的痛点 2. 什么是jenkins 3. jenkins的安装和配置 (1)下载 (2)安装 二.上传到运行服务器 1. jenkins构建服务器流 ...

最新文章

  1. Ubuntu16 安装Jira
  2. JAVA用多线程反而变慢了_Java中使用多线程不能明显提高程序效率的一些原因
  3. 史上最全的MySQL高性能优化实战总结!
  4. Python工程能力进阶、数学基础、经典机器学习模型实战、深度学习理论基础和模型调优技巧……胜任机器学习工程师岗位需要学习什么?...
  5. 深度学习之图像处理---七级浮屠
  6. JavaScript 更新对象属性
  7. 服务器内提取文件,linux命令如何提取文件夹内特定文件路径
  8. JavaFX UI控件教程(二十一)之Tooltip
  9. jsf绑定bean_JSF –渴望的CDI bean
  10. 怎么这两天总能看到刺激我的好东西
  11. Springboot-Jpa多数据库配置-2.0+版本
  12. Hibernate--使用xml配置映射关系
  13. [iOS] 完整源码, Swift语言 - 账号保存工具
  14. java day11【final、权限、内部类、引用类型】
  15. EL表达式结合页面JSTL使用 迭代显示表格
  16. logstash 吞吐量优化_logstash吞吐率优化
  17. 白日门传奇手游源码端
  18. pyecharts绘制条形图、饼图、散点图、词云图、地图等常用图形
  19. 内存分配方式与内存分配算法
  20. android平板怎么快速截屏,平板怎样截图(iPad截屏的3种方式)

热门文章

  1. 主成分分析法_“主成分分析法”——线上讨论会等你加入
  2. python3.8提示pip_Linux下升级安装python3.8并配置pip及yum的教程
  3. mac sublime html开发环境,在Mac下用Sublime Text 2 架设C开发环境
  4. java 自定义 转换器_Java笔记之SpringMVC(七):自定义String到Date的类型转换器
  5. web浏览器_你最常用的web测试-浏览器兼容性测试
  6. 洛谷P2068 统计和题解
  7. Django之ORM使用以及模板语言
  8. Mac python3.x使用HTMLTestRunner.py
  9. HDU 2037 今年暑假不AC
  10. 实例 18错误输出信息与调试信息