服务器之家

服务器之家 > 正文

Java利用jenkins做项目的自动化部署

时间:2021-05-11 14:13     来源/作者:小卖铺的老爷爷

最近领导要求上海本地的项目需要使用进jenkins实现自动化部署,以便可以直接将项目移交给运维的同学,减轻开发的工作量。记录下这次爬坑的过程。

一、前言

jenkins是基于java开发的一种持续集成工具,用于监控持续重复的工作,功能包括:

1、持续的软件版本发布/测试项目。

2、监控外部调用执行的工作。

上面是我从百科上down下来的,老实说没看懂,这是个什么玩意啊?其实以我现在的理解和应用,最多的便是部署了,其他功能待研究╮(╯_╰)╭撸主目前在上海一个不知名国企打工,我们现在项目的发布流程是:

1、本地或打包服务器利用maven打成war包

2、远程或者ssh连上项目服务器

3、停掉tomcat,删除旧包和缓存,将新打的包放进去

4、重启tomcat。完成看似步骤简单,其实占用了大量开发的的时间。

然后使用jenkins后:

1、点击立即构建,完成。什么?就点击个按钮就完成了,没错,就是个按钮。其实在你点击按钮后jenkins已经帮你把上述该走的流程后台跑了一遍了,本次就介绍下怎么让它后台跑。

二、安装构建

本次介绍基于windows,可安装在开发电脑或者windows server服务器

1、下载jenkins  

jenkins提供多种安装方式

1.1jenkins.msi安装 就像我们平时安装软件一样,点点点。下载地址:https://jenkins.io/download/

1.2jenkins.war 包 既然是war包,不用说大家都知道怎么启动了,扔到tomcat就行了。下载地址:http://updates.jenkins-ci.org/download/war/

2、启动jenkins

我个人是比较推荐1.1的安装方式的,1.2我在使用的时候经常遇到内存溢出的问题,当然内存溢出是可以调整的,但是多出了多余的工作量不是嘛。

采用1.1的安装方式,安装完成后我们会在windows的服务里面看到jenkins服务的。如下图,启动关闭重启直接点服务就行了。

Java利用jenkins做项目的自动化部署

采用1.2的的方式下载war包的话,其实有两种启动方式。

第一种,放到tomcat容器,

第二种,cmd进入安装目录,java -jar jenkins.war

3、安装jenkins

安装方式1.1和1.2 的流程是一样的

jenkins默认8080端口,可以修改,方法百度。

进入http://localhost:8080/。红色字体路径有密码,将密码填上,然后下一步。

Java利用jenkins做项目的自动化部署

选择插件,建议选择官方建议插件,避免很多麻烦。

Java利用jenkins做项目的自动化部署

等待安装中ing......

安装好后看到下图,用户名密码登陆用的,全名是用来显示的。继续下一步。

Java利用jenkins做项目的自动化部署

因为我要部署的是maven项目,jenkins默认的插件中是没有maven的,首先需要安装下。

Java利用jenkins做项目的自动化部署

点击下图插件直接安装就行了,maven integration plugins

Java利用jenkins做项目的自动化部署

安装热部署插件deploy to container plugin

Java利用jenkins做项目的自动化部署

4、配置jenkins

Java利用jenkins做项目的自动化部署

我们需要配下maven的setting文件,jdk以及maven地址,setting文件一定要配,不要用它默认的,撸主因为这个没配,出问题纠结好久。

Java利用jenkins做项目的自动化部署

Java利用jenkins做项目的自动化部署

Java利用jenkins做项目的自动化部署

最后apply然后save就行了,记得别忘了应用保存,不然白配了。

接着我们来新建一个项目,先输入项目名,选择maven项目,ok

Java利用jenkins做项目的自动化部署

Java利用jenkins做项目的自动化部署

选择源码管理,因为我们是企业项目,不是开源,使用的svn,选择subversion配置svn

url是你svn地址,credentials是账户密码

Java利用jenkins做项目的自动化部署

然后到pre steps,这个东西是打包前需要什么操作,比如我们现在的项目需要拷贝log4j.xml文件等等,根据环境可以写windows或者shell脚本

没有操作的话,就不用配了。

贴出我的脚本给大家参考,相关部分我用xxx替代

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
@echo off
 
rem 设置变量
 
:: app.xxx app.xxx代码的本地跟目录
set app.xxx="d:\svn\svn.173.x.x.x\app.xxx\"
 
::home.omm的log4j.xml 变量start
:: home_omm_log4j_goals_path 存放home.omm的log4j.xml的路径
set home_omm_log4j_goals_path="d:\svn\svn.173.x.x.x\app.xxx\src\home.omm\src\main\resources"
 
::home_omm_log4j home.omm的log4j.xml测试环境的路径
set home_omm_log4j="d:\svn\svn.173.x.x.x\app.xxx\config\home.omm\sh_test\resources"
::home.omm的log4j.xml 变量end
 
::home.weixin的变量start
:: home_weixin_log4j_goals_path 存放home.weixin的log4j.xml的路径
set home_weixin_log4j_goals_path="d:\svn\svn.173.x.x.x\app.xxx\src\home.weixin\src\main\resources"
 
::home_weixin_log4j home.weixin的log4j.xml测试环境的路径
set home_weixin_log4j="d:\svn\svn.173.x.x.x\app.xxx\config\home.weixin\sh_test\resources"
 
:: home_weixin_config.js_goals_path 存放home.weixin的config.js的路径
set home_weixin_config.js_goals_path="d:\svn\svn.173.x.x.x\app.xxx\src\home.weixin\src\main\webapp\module\js"
 
::home_weixin_config.js home.omm的log4j.xml测试环境的路径
set home_weixin_config.js="d:\svn\svn.173.x.x.x\app.xxx\config\home.weixin\sh_test\webapp\module\js"
::home.weixin的变量end
 
::service的变量start
:: service_log4j_goals_path 存放service的log4j.xml的路径
set service_log4j_goals_path="d:\svn\svn.173.x.x.x\app.xxx\src\service\src\main\resources"
 
::service_log4j service的log4j.xml测试环境的路径
set service_log4j="d:\svn\svn.173.x.x.x\app.xxx\config\service\sh_test\resources"
 
:: service_application_resources_all_goals_path 存放application-resources-all.xml的路径
set service_application_resources_all_goals_path="d:\svn\svn.173.x.x.x\app.xxx\src\service\src\main\resources\config\spring"
 
:: service_application_resources_all application-resources-all.xml测试环境的路径
set service_application_resources_all="d:\svn\svn.173.x.x.x\app.xxx\config\service\sh_test\resources\config\spring"
::service的变量end
 
 
::service.refresh的变量start
:: service_refresh_log4j_goals_path 存放service.refresh的log4j.xml的路径
set service_refresh_log4j_goals_path="d:\svn\svn.173.x.x.x\app.xxx\src\service.refresh\src\main\resources"
 
::service_refresh_log4j service的log4j.xml测试环境的路径
set service_refresh_log4j="d:\svn\svn.173.x.x.x\app.xxx\config\service.refresh\sh_test\resources"
 
:: service_refresh_application_resources_all_goals_path 存放application-resources-all.xml的路径
set service_refresh_application_resources_all_goals_path="d:\svn\svn.173.x.x.x\app.xxx\src\service.refresh\src\main\resources\config\spring"
 
:: service_refresh_application_resources_all application-resources-all.xml测试环境的路径
set service_refresh_application_resources_all="d:\svn\svn.173.x.x.x\app.xxx\config\service.refresh\sh_test\resources\config\spring"
::service.refresh的变量end
 
 
 
::判断home.omm的log4j.xml文件是否存在
if exist %home_omm_log4j_goals_path%\log4j.xml (del %home_omm_log4j_goals_path%\log4j.xml)
cd %home_omm_log4j_goals_path%
copy %home_omm_log4j%\log4j.xml log4j.xml
 
 
::判断home.weixin的log4j.xml文件是否存在
if exist %home_weixin_log4j_goals_path%\log4j.xml (del %home_weixin_log4j_goals_path%\log4j.xml)
cd %home_weixin_log4j_goals_path%
copy %home_weixin_log4j%\log4j.xml log4j.xml
 
::判断home.weixin的config.js文件是否存在
if exist %home_weixin_config.js_goals_path%\config.js (del %home_weixin_config.js_goals_path%\config.js)
cd %home_weixin_config.js_goals_path%
copy %home_weixin_config.js%\config.js config.js
 
 
::判断service的log4j.xml文件是否存在
if exist %service_log4j_goals_path%\log4j.xml (del %service_log4j_goals_path%\log4j.xml)
cd %service_log4j_goals_path%
copy %service_log4j%\log4j.xml log4j.xml
 
::判断service的application-resources-all.xml文件是否存在
if exist %service_application_resources_all_goals_path%\application-resources-all.xml (del %service_application_resources_all_goals_path%\application-resources-all.xml)
cd %service_application_resources_all_goals_path%
copy %service_application_resources_all%\application-resources-all.xml application-resources-all.xml
 
 
::判断service.refresh的log4j.xml文件是否存在
if exist %service_refresh_log4j_goals_path%\log4j.xml (del %service_refresh_log4j_goals_path%\log4j.xml)
cd %service_refresh_log4j_goals_path%
copy %service_refresh_log4j%\log4j.xml log4j.xml
 
::判断service.refresh的application-resources-all.xml文件是否存在
if exist %service_refresh_application_resources_all_goals_path%\application-resources-all.xml (del %service_refresh_application_resources_all_goals_path%\application-resources-all.xml)
cd %service_refresh_application_resources_all_goals_path%
copy %service_refresh_application_resources_all%\application-resources-all.xml application-resources-all.xml
 
exit

Java利用jenkins做项目的自动化部署

build编译了,指定pom位置,以及mvn命令,对了高级里面还可以配置workspace,不配默认在jenkins安装目录中

Java利用jenkins做项目的自动化部署

构建后操作,就是包打好了放在哪。选择下图

Java利用jenkins做项目的自动化部署

Java利用jenkins做项目的自动化部署

本次构建后操作,使用的是tomcat的热部署,热部署可以参考我之前的文章:tomcat7的热部署

war/ear:war包的地址

context:是部署后的包名

username/password是指热部署tomcat的账号/密码

url:tomcat的界面,如:http://172.16.101.71:8180/

5、开始构建

讲了那么多,终于到了最后了,一个按钮的操作终于到了,返回jenkins首页就可以看到我们的项目了。

Java利用jenkins做项目的自动化部署

构建后点击左下角构建执行状态中可以看到我们的项目在构建中。点击项目名进入

Java利用jenkins做项目的自动化部署

选择console就能看到我们构建过程中打印出来的日志或者错误信息了。

Java利用jenkins做项目的自动化部署

三、存在的问题

jenkins角色问题,既然是发布就涉及到生产环境,不能所有用户都有部署生产环境的权限吧,如果谁不小心点了下。那后果.....不敢相信。

解决:安装role-based authorization strategy插件,其余步骤参考:http://www.cnblogs.com/zz0412/p/jenkins_jj_14.html 不在详述。

tomcat热部署的问题,deploy几次之后出现内存上涨溢出,停止运行或者报错的问题,网上查了下是热部署本身的问题,正在寻求解决办法ing.....。

解决:tomcat热部署本身存在问题,生产环境一般不会采用热部署的方式。目前我这边测试环境因为使用的是windows server 2008系统,所以采用的是热部署的方式,问题依旧存在,但是我看过一个帖子是说可以使用windows 批处理命令的方式解决,就是bat命令,不过我还未深入研究过。生产环境linux系统,目前我使用publish over ssh 插件,具体步骤是配置中加入下图步骤。

1、在系统管理-》系统设置里找到publish over ssh然后输入:

Java利用jenkins做项目的自动化部署

2、配置post steps

这里还是接着上面的项目,这个配置得安装了上面的插件后才会显示!

Java利用jenkins做项目的自动化部署

Java利用jenkins做项目的自动化部署

transfer setsource files:表示要上传的本地的war包及路径,可到工作空间去看

remove prefix:表示要上传时要去除的文件夹,即只上传war包

remote driectory:即表示执行时的路径,相当于把war包上传到这里了

exec commad:要执行的命令

如图,会将war包放到home/admin文件夹,接着我会执行我写的shell命令。主要涉及,停止tomcat,备份原war包,删除webapp下原war包,将home/admin下的新war包拷进来,启动tomcat,然后就完成了。这样就避免了热部署内存溢出导致服务器崩溃的问题了。

脚本参考:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/sh
#defined 
tomcat_home="/usr/java/tomcat/apache-tomcat-7.0.67/"
id=`ps -ef | grep java | grep tomcat|awk '{print $2}'`
echo $id 
echo "kill tomcat"
kill -9 $id
echo "remover war file"
cd "$tomcat_home"/webapps
rm -rf javaweb-0.0.1-snapshot
rm -rf javaweb-0.0.1-snapshot.war
echo "copy war to webapp"
cd /home/lin
cp javaweb-0.0.1-snapshot.war "$tomcat_home"/webapps
cd "$tomcat_home"/bin
echo "start tomcat"
./startup.sh

deploy插件问题,上文中使用的deploy to container plugin插件来实现热部署,但是deploy插件限制一个工程只能部署一个war包,我的项目是,一个工程前后端分离的两个war,总不能新建两个项目构建两次吧, ̄へ ̄。

解决:热部署尽量不要使用,测试环境暂时使用的话,我目前是,新建两个工程,每次只编译一个war包。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://www.cnblogs.com/laoyeye/p/7076360.html

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
2021德云社封箱演出完整版 2021年德云社封箱演出在线看
2021德云社封箱演出完整版 2021年德云社封箱演出在线看 2021-03-15
返回顶部