Jenkins+tomcat自动发布的热部署/重启及遇到的坑解决办法
一.背景
公司的项目一直手动maven打包、上传服务器、关闭/开启tomcat,整个流程下来耗时耗力,虽然可以将所有流程通过shell脚本一次性解决,但如果可以通过idea的Jenkins插件一键自动部署,那更省时省力。
下面是一个简单的发布tomcat的shell脚本,执行下面脚本的前提是要在服务器中安装了git、maven
# 先关闭tomcat进程
kill -9 `ps aux|grep tomcat|grep -v 'grep'| awk 'NR==1{print $2}'`
# 切换到项目存放位置
cd nxyyProjectSource/NXYY
# git拉取最新代码
git pull xxxx
# 切换到项目下面的代码存放位置
cd nxyy
# maven打包
mvn clean
mvn install -DskipTests
# 将war包放到tomcat下
cd
cp nxyyProjectSource/NXYY/nxyy/target/nxyy.war /home/tomcat/webapps
# 开启tomcat
cd /home/tomcat/bin
./startup.sh
# 查看日志
tail -f ../logs/catalina.out
每次git拉取时,都需要密码,进行下面的配置后,只需要在第一次输入密码后会永久保存到服务器中,下次再git拷贝/拉取时就不需要输入密码了:
git config --global credential.helper store
如果想清除账号和密码,输入:
git config --global credential.helper reset
如果想临时存储(默认15分钟),输入:
git config --global credential.helper cache
  单独对某个项目免密,在https链接里加入username:password
git remote add origin https://username:password@xxx.git
  上面这些配置保存在.git/config里。
二.Jenkins的安装/配置/热部署/脚本tomcat重启
- 下载安装包jenkins.war;
- 在安装包根路径下,运行命令- java -jar jenkins.war --httpPort=8080(linux环境、Windows环境都一样),运行后有一个密码,需要登录时使用: 
- 打开浏览器进入链接- http://ip:8080,
- 选择后,进入插件安装页面,有些插件安装失败,可以点击到后面的再次安装: 
- 设置初始用户和密码,为下次登录时使用: 
- 进入系统,安装完成: - 注意,如果还是进入不了系统,需要稍等一下,或者刷新页面,如果还是进入不了,需要重新启动jenkinds服务器,在启动首页url后面加上restart就可以了【重启:- http://ip:8080/restart】;
- 如果输入默认密码之后,一直卡住问题: - 在$JENKINS_HOME/hudson.model.UpdateCenter.xml文件中,默认内容如下:- <?xml version='1.0' encoding='UTF-8'?> 
 <sites>
 <site>
 <id>default</id>
 <url>http://updates.jenkins-ci.org/update-center.json</url>
 </site>
 </sites
- 这个地址在外国的服务器,因为墙的原因,下载初始化界面所需插件不了,就一直处于等待状态,把url改为- http://mirror.xmission.com/jenkins/updates/update-center.json就解决了
 
 
- 进行系统系统配置设置Jenkins的访问路径,当然,这个路径在创建用户名之后会出现: 
- 设置插件安装源:插件管理 -> 高级,http://mirror.xmission.com/jenkins/updates/current/update-center.json 
- 进行系统管理的全局工具配置,maven、JDK、Git的配置:  
- 配置完后进行项目的搭建,选择新建任务: 
- 在进行项目信息配置前,需要一些凭证Credentials信息,比如git的用户名和密码、tomcat用户的用户名和密码:系统管理 -> 凭据(Manage Credentials) - 需要tomcat的用户名和密码,是为了让Jenkins可以远程发布tomcat,在tomcat的conf下tomcat-users.xml里面配置的:tomcat远程发布需要修改tomcat-users.xml、context.xml(下文构建遇到的坑第5点)、manager.xml(下文构建遇到的坑第6点)- <tomcat-users xmlns="http://tomcat.apache.org/xml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd" version="1.0"> <role rolename="manager-gui"/>
 <role rolename="manager-script"/>
 <role rolename="manager-jmx"/>
 <role rolename="manager-status"/>
 <role rolename="admin-gui"/>
 <user username="用户名" password="密码" roles="manager-gui,manager-script,manager-jmx,manager-status,admin-gui"/>
 </tomcat-users>
 
- 进行项目信息的配置,在配置完进行构建,tomcat必须在服务器中是启动状态:   
- 上面是tomcat热部署,下面进行tomcat的重启执行项目:- 先安装插件Publish Over SSH,进行信息配置:系统管理 -> 信息配置 -> Publish over SSH 
- 构建的配置前需要创建一个重启tomcat的脚本:vi tomcat.sh,然后赋予执行权限chmod 777 tomcat.sh- #这里需要加上JAVA_HOME的配置,虽然在本地的环境变量中已经配置了,但是远程调用的时候,还是需要配上的,否则执行脚本出错。 
 export JAVA_HOME=/usr/java/jdk1.8.0_141-cloudera
 # tomcat的位置
 tomcat_home=/home/tomcat-dev
 #【3.1】 停止tomcat变量
 SHUTDOWN=$tomcat_home/bin/shutdown.sh
 #【3.2】 启动tomcat变量
 STARTTOMCAT=$tomcat_home/bin/startup.sh
 #【3.3】 删除所有项目文件包括war包和war解压后的文件 如果是局部发布这句不需要 这只是正对jenkins整个war发布
 rm -rf /home/tomcat-dev/webapps/TSISAPP* #得到进程ID 这里也可以简写 如果你ps -ef|grep 项目名称 可以带出PID 那么可以直接写成这样
 #之前为什么写那么长 是因为在用jenkins调用脚本的时候,也会带出jenkins调用脚本的那个进程 这样kill -9 就会killjenkins进程 导致一建发布中断
 #所以这里一直写到了conf文件夹目录
 #如果不需要用到jenkins可以用下面简洁版 得出PID命令
 #PID=`ps -ef |grep 项目名称 |grep -v grep | awk '{print $2}'`
 #【3.4】 获取进程ID
 PID=`ps -ef |grep /home/tomcat-dev/conf |grep -v grep | awk '{print $2}'`
 if [ ! "$PID" ];then # 这里判断TOMCAT进程是否存在
 echo "进程不存在"
 else
 echo "进程存在 杀死进程PID:$PID"
 kill -9 $PID
 fi #【3.5】启动项目
 $STARTTOMCAT
 echo "启动项目"
- 构建:Post Steps选择Send files or execute commands over SSH,下面的构建后操作 -> Deploy war/ear to a container 就不需要了:  
 
三.构建遇到的坑
- 如果没有构建一个maven项目,在插件中查找后进行安装:Maven Integration plugin
- 在构建后如果没有Deploy war/ear to a container,在插件中查找后进行安装:Deploy to container Plugin
- 出现下面的错误:- [ERROR] No goals have been specified for this build. You must specify a valid lifecycle phase or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>. Available lifecycle phases are: validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy, pre-clean, clean, post-clean, pre-site, site, post-site, site-deploy. -> [Help 1] - 解决办法:在pom.xml的<build>标签中添加- <defaultGoal>install</defaultGoal>
 
- 出现下面的错误:org.codehaus.cargo.container.ContainerException: Failed to deploy 或org.codehaus.cargo.container.ContainerException: The [cargo.remote.username] and [cargo.remote.password] properties are mandatory and need to be defined in your configuration- 解决办法:在pom.xml的<build>标签中的<plugins>中添加- <plugin> 
 <groupId>org.codehaus.cargo</groupId>
 <artifactId>cargo-maven2-plugin</artifactId>
 <version>1.4.9</version>
 <configuration>
 <container>
 <!-- 容器版本名称-->
 <containerId>Tomcat 9.x</containerId>
 <type>remote</type>
 </container>
 <configuration>
 <type>runtime</type>
 <properties>
 <!-- tomcat管理界面-->
 <cargo.remote.uri>http://ip:8888/manager/text</cargo.remote.uri>
 <!-- tomcat管理界面用户名和密码-->
 <cargo.remote.username>用户名</cargo.remote.username>
 <cargo.remote.password>密码</cargo.remote.password>
 </properties>
 </configuration>
 </configuration>
 </plugin>
 
- 出现下面的问题:Caused by: org.codehaus.cargo.container.tomcat.internal.TomcatManagerException: The username you provided is not allowed to use the text-based Tomcat Manager- 解决办法:到tomcat的 /webapps/manager/META_INF/context.xml文件,将文件中对访问的来源受限设置注释- <Context antiResourceLocking="false" privileged="true" > 
 <!--
 <Valve className="org.apache.catalina.valves.RemoteAddrValve"
 allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
 --> //注释掉即可
 <Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
 </Context>
 
- tomcat远程连接出现403拒绝,在conf/Catalina/localhost下添加manager.xml- <?xml version="1.0" encoding="UTF-8"?> 
 <Context privileged="true" antiResourceLocking="false"
 docBase="${catalina.home}/webapps/manager">
 <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="^.*$" />
 </Context>
- idea结合Jenkins插件进行远程发布,在Crumb Data通过http://ip:8080/crumbIssuer/api/xml?tree=crumb#获取填入时,出现CSRF enabled -> Missing or bad crumb data  - 通过搜索网上解决方案,大多都是说开启CSRF服务, 
- 但还是无法解决该问题,解决办法:点击用户名 -> 设置 -> API Token -> 当前 Token,通过token名生成token,代替上面的用户名和密码,最后终于成功了   
 
Jenkins+tomcat自动发布的热部署/重启及遇到的坑解决办法的更多相关文章
- IDEA tomcat三步实现热部署
		IDEA tomcat三步实现热部署 添加Artifacts选项 添加Artifacts选项,XXXwar 和 XXXwar exploded二选一,若要热部署须选后者. 设置tomcat部署方案 设 ... 
- MVC3在IIS7.5发布(部署)报403.14错误的解决办法
		MVC3在IIS7.5发布(部署)报403.14错误的解决办法 错误现象: 报403.14 forbidden错误 web服务器被配置为不列出此目录的内容. 解决办法: 检查站点的处理程序映射 ... 
- Asp.Net Core2.0获取客户IP地址,及解决发布到Ubuntu服务器获取不到正确IP解决办法
		1.获取客户端IP地址实现方法(扩展类) using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc.ModelBinding; u ... 
- 【转】Asp.Net Core2.0获取客户IP地址,及解决发布到Ubuntu服务器获取不到正确IP解决办法
		1.获取客户端IP地址实现方法(扩展类) using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc.ModelBinding; u ... 
- IIS 发布ASP.NET MVC 4.0 错误500.21解决办法
		由VS2013 写好的MVC 4.0 发布在服务器IIS 上报错500.21,解决办法:尝试多种网上介绍的办法,最后发现还是模块问题. 
- tomcat 和 jboss的热部署(热发布)问题
		所谓的热部署(热发布)(下面称为“热部署”),就是说,在web工程发布之后,不可避免的,会遇到修改BUG的问题.现在的热部署就是为了解决这个问题,其功能就是说:在不停止web服务的同时,对jsp和Ja ... 
- Docker化tomcat 并且使用maven热部署
		今天没事干 就把自己的tomcat docker化并且使用maven实现热部署 特别记录一下~ 1.首先进行centos7的安装 就不在记录了 注意的是最好使用centos7 因为docker 依赖 ... 
- Intellij IDEA 使用jrebel运行spring-boot并实现自动编译进行热部署
		在使用jrebel运行spring-boot的时候,会发现一个很棘手的问题,就是项目不能自动编译,不能自动编译就不能实现热部署.(使用jar包方式运行的时候) 那么我们就要解决自动编译的问题,首先: ... 
- Java+Tomcat + Idea +  Jrebel 实现热部署
		1. 首先安装idea的jrebel插件, jrebel是收费的,所以要在网上下载验证码. 2. 安装好以后再setting 菜单能看到一个jrebel的菜单. 3. 4.其中需要选中frame失去 ... 
随机推荐
- kali设置NAT模式,无法正常上网请试试这个办法
			1.释放网卡: dhclient -r eth0 2.自动获取网络 dhclient -v eth0 3.开启22端口 lsof -i :22 4.打开ssh service ssh start sy ... 
- @bzoj - 3148@ 没头脑和不高兴
			目录 @description@ @solution@ @part 1:期望@ @part 2:方差@ @accepted code@ @details@ @description@ 没头脑和不高兴是 ... 
- Fibonacci(模板)【矩阵快速幂】
			Fibonacci 题目链接(点击) Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 20989 Accepted: 14 ... 
- 小师妹学JVM之:JVM的架构和执行过程
			目录 简介 JVM是一种标准 java程序的执行顺序 JVM的架构 类加载系统 运行时数据区域 执行引擎 总结 简介 JVM也叫Java Virtual Machine,它是java程序运行的基础,负 ... 
- TensorFlow从0到1之TensorFlow实现反向传播算法(21)
			反向传播(BPN)算法是神经网络中研究最多.使用最多的算法之一,它用于将输出层中的误差传播到隐藏层的神经元,然后用于更新权重. 学习 BPN 算法可以分成以下两个过程: 正向传播:输入被馈送到网络,信 ... 
- 729. My Calendar I
			原题链接:https://leetcode.com/problems/my-calendar-i/description/ 我的答案 虽然自己实现出来了,但是没看懂这道题目考查的是什么?编程语言的熟练 ... 
- 手写spring事务框架-蚂蚁课堂
			1.视频参加C:\Users\Administrator\Desktop\蚂蚁3期\[www.zxit8.com] 0017-(每特教育&每特学院&蚂蚁课堂)-3期-源码分析-手写Sp ... 
- java程序员软件测试技巧
			测试是开发的一个非常重要的方面,可以在很大程度上决定一个应用程序的命运.良好的测试可以在早期捕获导致应用程序崩溃的问题,但较差的测试往往总是导致故障和停机. 测试是开发的一个非常重要的方面,可以在很大 ... 
- WARN deploy.SparkSubmit$$anon$2: Failed to load org.apache.spark.examples.sql.streaming.StructuredNetworkWordCount.
			前言 今天运行Spark Structured Streaming官网的如下 ./bin/run-example org.apache.spark.examples.sql.streaming.Str ... 
- P1640 [SCOI2010]连续攻击游戏【并查集】
			题目描述 lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备时,他只能使用该装备的某一个属性.并且每种装备 ... 
