如何实现tomcat自动化部署?

风空兮


最近接触了jenkins这个东西,所以花点时间了解了下。它可以在代码上传仓库(如github,gitee,gitlab)后,在jenkins(一个网站界面)中通过获取代码仓库中最新代码,进行自动化部署,而省去手动打包、上传服务器、部署这一系列步骤,非常方便。

下面教程分为以下几个部分:

一、在你的本地电脑或者linux服务器上下载安装jenkins:

jenkins下载地址:https://jenkins.io/ 下载网站的war包版本就好了

下载完后把它部署到你的tomcat上运行:放到tomcat的webapps目录下,启动tomcat(windows下双击startup.bat或者linux下运行sh startup.sh),然后通过浏览器访问,如我的电脑上访问:localhost:8080/jenkins 。启动后的界面如下:

然后到提示的文件中把里面的文本复制出来填到管理员密码中。

接着如果是在本地电脑跑,可能会出现:该jenkins实例似乎已离线 提示,如果出现,是因为本地https访问不了的原因。在浏览器中另打开一个界面http://localhost:8080/pluginManager/advanced,把升级站点中的url中的https改为http,保存更新。然后关掉tomcat服务器重启,就可以联网了。

接下来选择安装推荐的插件,这个需要一定的时间。最后额外推荐安装两个插件,在系统管理中可以安装插件:

1、 Rebuilder
2、 Safe Restart

二、在linux服务器中安装git, maven,创建一个jenkens目录,配置git的公钥到你的github上,这些步骤是使用jenkins的前提。

安装git的目的是在自动化部署前实时从git远程仓库中拉取最新的代码。在linux(我用的是centos系统)安装git:

yum install git

生成密钥:

ssh-keygen -t rsa -C "[email protected]"

可以不设置密钥密码直接按三次回车。 把家目录中生成的公钥内容复制到github或其他仓库上。

安装maven的目的是通过项目中的pom.xml文件自动解决项目依赖问题,构建项目。linux中通过wget+下载链接下载maven的zip包然后解压即可。配置maven环境变量:

vim /etc/profile

//在这个文件末尾加上
export MAVEN_HOME=/root/maven3.4.5
export PATH=$MAVEN_HOME/bin:$PATH

//保存后在命令行输入,启动配置
. /etc/profile

创建jenkins目录,用来存储拉取下来的项目代码等。

三、将Linux服务器注册到Jenkins上

1、开启服务器上的ssh服务,可通过 netstat -anp | grep :22命令查看是否开启

2、先来测试一下怎么在jenkins中操作远程服务器

在jenkins中选择系统管理——》新建节点

其中远程工作目录即你在Linux上创建的jenkins目录。在Credentials添加一个远程用户,输入你的远程机器用户名和密码保存。

点击TestEnv,启动代理。

在全局工具配置中配置git命令:

3、自动化部署过程原理:

所以需要编写一个shell脚本来执行这个过程。

具体的创建Jenkins任务的过程为

1.创建jenkins任务

2.填写Server信息

3.配置git参数

4.填写构建语句(shell脚本),实现自动部署。

四、创建自动化部署任务

1、编写shell部署脚本deploy.sh,并放到linux服务器中的jenkins目录下,在该目录下通过touch deploy.sh创建一个脚本,把下面的脚本复制到里面即可(到时每次自动部署都会执行它),脚本中的my-scrum为我要自动构建的项目名:

#!/usr/bin/env bash
#编译+部署项目站点

#需要配置如下参数
# 项目路径, 在Execute Shell中配置项目路径, pwd 就可以获得该项目路径
# export PROJ_PATH=这个jenkins任务在部署机器上的路径

# 输入你的环境上tomcat的全路径
# export TOMCAT_APP_PATH=tomcat在部署机器上的路径

### base 函数
killTomcat()
{
#pid=`ps -ef|grep tomcat|grep java|awk '{print $2}'`
#echo "tomcat Id list :$pid"
#if [ "$pid" = "" ]
#then
# echo "no tomcat pid alive"
#else


# kill -9 $pid
#fi
#上面注释的或者下面的
cd $TOMCAT_APP_PATH/bin
sh shutdown.sh
}
cd $PROJ_PATH/my-scrum
mvn clean install

# 停tomcat
killTomcat

# 删除原有工程
rm -rf $TOMCAT_APP_PATH/webapps/ROOT
rm -f $TOMCAT_APP_PATH/webapps/ROOT.war
rm -f $TOMCAT_APP_PATH/webapps/my-scrum.war

# 复制新的工程到tomcat上
cp $PROJ_PATH/scrum/target/order.war $TOMCAT_APP_PATH/webapps/

cd $TOMCAT_APP_PATH/webapps/
mv my-scrum.war ROOT.war

# 启动Tomcat
cd $TOMCAT_APP_PATH/
sh bin/startup.sh

2、在jenkins上点击新建一个任务,填好任务名,填写运行的节点(上文中新建节点时创建的):

3、点击源码管理,填写github(或gitlab等)地址:

4、点击add,选择check out to a sub-directory ,添加源码下载到jenkins目录下的指定目录(可以命名为你的项目名):

5、填写构建任务时的shell脚本,然后保存,点击立即构建完成自动构建。(这里有一个坑,一定要给tomcat下所有sh文件加上x权限才能启动tomcat成功,具体为在tomcat目录上层执行chmod a+x -R tomcat目录或者在tomcat的bin目录下执行chmod +x *.sh)

#当jenkins进程结束后新开的tomcat进程不被杀死
BUILD_ID=DONTKILLME
#加载变量
. /etc/profile
#配置运行参数

#PROJ_PATH为设置的jenkins目录的执行任务目录
export PROJ_PATH=`pwd`
#配置tomcat所在目录
export TOMCAT_APP_PATH=/root/tomcats/tomcat-my-scrum

#执行写好的自动化部署脚本
sh /root/jenkins/

deploy.sh

6、自动化构建成功:

7、后续代码如果有改动,只要push到github或者gitlab等上,在jenkins界面中再次执行构建任务就可以了,非常方便,自动化部署,再也不用手动上传项目到服务器了。

五、解决一个tomcat关闭,所有tomcat都被关闭了的问题(如果你的jenkins也是安装的服务器上的其中一个tomcat中,就可能被莫名杀掉)

这是因为所有的tomcat的关闭脚本(shutdown.sh或者说catalina.sh)都默认监听的是8005端口。只要进去tomcat目录下的conf目录下的server.xml文件中,将

<server>
<listener>
/<server>

中的8005端口改为不同的端口,就不会一个tomcat关闭,所有的tomcat都被关闭了

六、以后可以在linux服务器中安装多个tomcat,来部署不同的项目,分别使用不同的端口,如我喜欢用8081,8082,8083等端口来解决多个tomcat端口冲突问题(在tomcat的conf目录下的server.xml中修改即可,默认为8080)。然后可以用jenkins来管理这些tomcat的自动化部署啦。


Sapsoft地理信息


像BAT这样的大公司,都是有一套自动化流水线的,出于公司安全红线要求,我无法讲的太细,但是我可以提供些思路给题主参考。

工具

工欲善其事,必先利其器,我们先来说需要哪些工具

1 git,用于保存最新要上线的代码

2 maven,用于打包项目

3 Jenkins,用于触发任务

4 sh脚本或者Python脚本,执行Jenkins任务的脚本

流程

接下来是实际的流程。

首先,由开发人员把要上线的代码上传到指定代码库。

然后,开发人员触发Jenkins任务。

这个Jenkins的任务是自动化部署的核心,包含以下步骤

1 开始对代码进行打包

2 把包放到服务器指定文件夹下

插一句,为了安全起见,我们建议的是进行热部署,何为热部署?

热部署需要Nginx+多台Tomcat的配合。

假设目前只有一台Tomcat连接到了Nginx上,那么可以把要更新的代码部署在另一台Tomcat上,然后启动新的Tomcat,确认该服务启动成功,各能力已经启动后,再去修改Nginx的conf文件,把原本给旧Tomcat的请求切到新Tomcat上,这样就实现了热部署。如果不使用这种办法,而是直接在旧的Tomcat上部署新的war包的话,重启Tomcat的过程,就会有几秒停服,这对用户来说是不可接受的。既然说到这里,再介绍两个热部署用到的Nginx的命令。在修改Nginx的conf文件后,要在Nginx的根目录下执行sbin/nginx -t 来检查当前conf文件配置是否正确,如果是“successful”的,就可以执行sbin/nginx -s reload来进行实现把新的流量切到新的机器上,即使新的conf文件生效。

好的,关于热部署的部分说完了,我们再说回来。

3 将旧的服务器根目录下的war包用cp命令放到一个专门备份的文件夹下

4 将新的war包同样用cp命令放到即将启动的Tomcat根目录下的webapps文件夹下,然后解压

5 执行sh bin/

start.sh

启动新的Tomcat

6 检查该Tomcat是否启动成功,包括进程存在,tail -f

catalina.out

日志一直在打,api能够调通

7 修改Nginx的conf文件

8 检查Nginx配置文件是否successful

9 更新Nginx配置,即sbin/nginx -s reload

10 继续观察新Tomcat是否运行正常,如果不正常则立刻切回原Tomcat,本次自动更新失败

11 如果正常,则停止旧的Tomcat。

以上,自动化部署完成。

我是苏苏思量,来自BAT的Java开发工程师,每天分享科技类见闻,欢迎关注我,与我共同进步。


苏苏思量


虽然我只是个开发人员,但是很多时候都是我们自己完成环境部署,目前我们测试环境实现了自动化部署,是基于Jenkins来做的;生产环境暂时还是【人肉】部署。整体的发布水平和很多公司还是有很大的差距,不过公司缺少一些基础平台,我们也只能自己想办法。


自动化发布,前置工作有很多

通过Jenkins实现自动化发布的过程很简单:

  • 开发人员把代码通过git或者svn提交;

  • Jenkins可以通过手动或定时的方式启动,会更新最新的代码,跑全量的测试用例,测试通过后进行代码的部署;部署的过程都是提前写好的脚本,比如通过什么命令打包,把包放到哪台服务器的哪个目录下面,通过什么命令停止和启动(重启)服务。(具体的安装和配置,搜索一下会找到很多资料)

自动化发布看起来非常简单,但实际上前置工作很多:

  • 需要有代码版本控制工具:这个问题不大,基本上每个公司都会有,最常用的git和svn;需要告诉Jenkins项目的代码在哪里。
  • 自动化构建工具:如Maven、Gradle、Ant,我们基本都用Maven,个别特别老的项目用的Ant;需要告诉Jenkins项目执行什么命令可以打包。

  • 整包发布:我了解还是有不少公司喜欢增量发布,但是我觉得如果能做到全量发布的话是最好了,能避免很多的问题。
  • 单元测试:很多人会忽视这个问题,我还是觉得很有必要的;写单元测试要发自内心地觉得有用,而不是为了追求测试覆盖度,不是为了做给领导看。
  • 灰度发布和回滚:这一点我们也没有做到,上线就是全部都上线,有问题的话就全部回退;我们项目尽量做到了【人肉灰度发布】,也就是先更新一个server,然后验证通过之后,再更新下一个;回滚也是人肉操作。
  • 容器:要是公司用到了容器的话,那么自动化发布会容易一些...

人肉发布,想尽办法减少工作量

  • 因为很多基础平台没有(我们公司很多工作都做了细分),一些事情的推进不是开发就可以推进的,通常需要很多部门的配合;所以生产环境依然还是手动发布。

  • 拆包:我们项目是纯接口的项目,没有页面;项目被拆成了几个包,有单独一个包是对外提供服务的,也就是说,其余几个包随时可以在线发布,反正对用户是无感的;

  • 编写各种shell脚本:既然做不到自动化发布,那么就让发布尽可能简单;可以把发布过程中一系列的命令,都写到shell脚本里面完成;

  • 伪灰度发布:对外提供接口的包被部署在N个server上(使用Spring Boot内嵌的Tomcat),前面挂着Nginx,Nginx可以监控每个server(节点)的存活,所以发布的时候先停掉一个server做程序更新,Nginx会知道这个server不存活,这时候不会再发送新的请求到这个server上,直到程序更新完成启动。


我将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。


会点代码的大叔


1、需要一个SCM也就是代码控制管理工具,现在用git的比较多,当然也可以用svn;

2、需要侦探出需要部署的实际,有如下几个办法:

(1)对于git或者svn来说,都有hook,比如merge,commit,update之后触发等,比如,提交了一个文件之后,触发调用一个url;

(2)做一个定时任务,每半个小时或者1个小时检查源代码,看是否有代码的改变,如果有,则需要往下去做部署。

这一步一般使用Jenkins创建job;

3、打包

针对步骤2,如果是全量包,比较好做,也就是只要检测出代码有改变,则直接使用Maven,ANT,Gradle直接的打包工具进行打包即可。但是如果是增量包,则需要通过git log或者svn log等检查出具体更新的文件,然后针对文件是否需要编译继续操作,当然一个更简单的办法,就是代码全量编译,然后真针对有变更的文件进行操作。本步骤可以得到修改后的文件(class或者静态文件)以及路径。

这一步一般使用Jenkins创建job,然后使用Maven或者ANT或者Gradle等工具;

4、上传

从第三步中获取到的文件和路径,需要上传到tomcat服务器中。如果是全量包,要好做一些,直接用脚本scp合作和jenkins的tomcat插件传到远程服务器即可。如果是增量包,则需要写脚本针对每个不同的文件进行上传。

这一步一般用Jenkins,也可以自己写python或者shell脚本;

5、重启

无论是重启tomcat或者ng等,原理都一样:

(1)获取服务器进程id;

(2)kill掉进程;

(3)start 服务。

此三步可以用python的psutil或者shell脚本实现。调用实现也是通过Jenkins。


综上,几个关键工具和步骤:

1、版本控制管理,git或者svn,获取文件变更通知和内容;

2、打包,java系的是maven,ant,gradle这些;

3、jenkins,侦测代码的变更、调用打包工具、上传包和重启服务器。


一般来讲,还需要加一步,就是重启之后的服务器连通性验证,以免服务没有启动成功造成生产故障。


测试领域专家


自动化部署在互联网中已经非常成熟了。也有很多的开源方案。

现在用Jenkins 自动部署的比较多,详细的配置可以网上搜。

自动部署流程一般如下

  1. git同步最新代码
  2. 使用maven打包项目
  3. 停止tomcat服务器
  4. 部署项目
  5. 启动tomcat服务器

通过web操作的过程一般都是

通过web页面调用jenkins脚本,进行代码编译,代码编译建议在干净环境区编译,编译成功后,把上线java文件上传到上线文件服务器,然后修改配置文件。利用命令调用远程服务器端部署监控程序,下载服文件服务器部署jar,下载最新配置文件进行替换。然后备份原来jar文件,删除jar,把新的jar替换。自动重启就可以。也可以开发远程看启动日志页面。可以查询web是否启动正常。当然完善的自动部署还会涉及到自动切换流量。上线成功后状态回传等。详细的内容比较多。你可以关注我的头条号。改天我可以总结一个完整的产品流程和实现


三僡然


看了一下各位楼主的回答,确实不错。

说说我个人的看法吧,希望对你有帮助。

各位楼主说了好多工具,当然都可以用无可厚非,工欲善其事必先利其器,工具当然是好的,但是不要被太多的工具束缚了从而耽误浪费更多的时间。

如果只是单纯的部署的话,也不费事。无非题主的意思是这部分工作重复性高,复杂度低,但是比较重要,日常工作中用在部署上的时间太多,不值得,更不值得去加太多的班,因为好多重要应用系统都必须要在非业务时段去做变更,所以加班就不可避免了。

所以呢,花一点时间出来,梳理一下你们部署的流程,例如,上线准备(下载投产包等)、备份(备份程序和配置文件、数据备份等)、程序更新、数据库更新、修改配置、重启服务、技术检查等,梳理好之后,开始开发这样一整套自动化流程,固定下来,尽量不要人工干预,除非必要的增加断点提醒,至于用什么语言开发,shell、bat、 Python等脚本最好不过,也可以考虑使用java开发,然后用shell、bat或Python封装成脚本,这些都是核心功能,等完全实现了,部署的工作就可以变成一键启动执行一个脚本就搞定了,不用再手工每次重复操作那么多步骤而且还容易出错。等一键执行功能成熟之后你就可以设置定时任务,让它定时自动发起就不用加班守候了。

以上就是自动化的一个简单粗暴的实施方案,供参考。



syuno


tomcat自动化部署脚本实现的功能如下:

(1) 检查tomcat进程是否存在,如果存在则kill掉

(2) 备份现有war包到tomcat/backup目录

(3) 复制当前目录新war包到tomcat/webapps目录

(4) 启动tomcat

shell脚本内容如下:

#!/bin/bash

now=`date +%Y%m%d%H%M%S`

tomcatPath=/usr/local/tomcat/software/tomcat6

backupPath=/usr/localtomcat/software/tomcat6/backup

war=$1

if [ -e "$war.war" ]; then

echo -e "\\033[34m war archive: $war.war \\033[0m"

else

echo -e "\\033[31m war archive '$war.war' not exists \\033[0m"

exit -1

fi

# change color

echo -e "\\033[34m"

#create backup dir

if [ ! -d "$backupPath" ]; then

mkdir "$backupPath"

fi

echo "tomcat home: $tomcatPath"

echo "backup path: $backupPath"

echo 'try to stop tomcat...'

pid=`ps aux|grep "java"|grep "$tomcatPath"|awk '{printf $2}'`

if [ -n $pid ]; then

echo "tomcat pid: $pid";

kill -9 $pid;

fi

echo 'stop tomcat finished...'

echo 'backup old archive...'

if [ -f "$tomcatPath/webapps/$war.war" ]; then

mv -v "$tomcatPath/webapps/$war.war" "$backupPath/$1_$now.war";

fi

rm -rf $tomcatPath/webapps/$war*

echo "copy $war.war archive to webapps.."

cp -v "$war.war" "$tomcatPath/webapps/"

echo -e "\\033[32m"

echo 'startup tomcat...'

sh $tomcatPath/bin/startup.sh

tail -10f $tomcatPath/logs/catalina.out

使用时,需要先修改tomcatPath的值为实际tomcat路径。

保存该文件到autodeploy.sh, 执行命令:

Shell执行代码

./autodeploy.sh abc

autodeploy.sh和abc.war


淮安二傻子


题主,这个问题很好做,写一个shell脚本就可以搞定

下面是我给你的解决方案(linux系统下):

开发人员使用Git或者SVN把修改好的代码提交到SVN或Git服务器上,然后在做检出打包的功能,步奏如下:

1.删除原来tomcat下的webApp

2.checkout 最新的代码,进行打包和copy到tomcat的目录下

3.再次启动tomcat服务器


若只是初见good


发布到本地的话,在maven中使用tomcat plugin即可,如果要发布到测试环境SIT或UAT环境,应该使用ci工具比如Jenkins, 在Jenkins中建一个continues project, 只要有code checkin, 就自动build和deploy到测试环境,在Jenkins中还需要有一个release project, 因为continues自动build的都是snapshot,这不能部署到production上去, 这个release project就是用来build release版本,然后publish到公司内部的maven repositories(一般用nexus),开发人员不应该允许操作production环境, 应该由专门的服务器管理人员从nexus上下载release版本进行production的部署。

题外说一点,大多数部署也包含数据库脚本的变化,这怎么自动部署,也是有很好的工具比如liquibase,用liquibase建立数据库命令的版本控制,打包在war/ear中,部署时liquibase能自动检测环境中现有的数据库脚本的版本,而运行没有部署过的数据库脚本命令。


Gary2018


tomcat的conf目录下有一个server.xml文件。里面context标签下有一个属性叫reload=true,你设置一下。以后他就会自动部署


分享到:


相關文章: