风空兮
最近接触了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、 Rebuilder2、 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
启动新的Tomcat6 检查该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 自动部署的比较多,详细的配置可以网上搜。
自动部署流程一般如下
- git同步最新代码
- 使用maven打包项目
- 停止tomcat服务器
- 部署项目
- 启动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,你设置一下。以后他就会自动部署