一、环境准备

1)Jenkins 部署 WAR 包:jenkins.war(2.164.2 版本,WAR 包官方下载路径:https://jenkins.io/download/)
2)Tomcat 服务器:apache-tomcat-7.0.94-windows-x64.zip(使用 Jdk1.8)
3)其他:SVN 服务器,部署环境为联网状态(为联网安装 Jenkins 插件)
具体搭建过程参考我另一篇博客:信步漫谈之Jenkins—集成环境搭建

二、集成自动化部署 SVN 项目流程图

信步漫谈之Jenkins—集成自动化部署 SVN 项目 随笔 第1张

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

三、Jenkins 自动化部署插件安装

1)Jenkins 在初始安装时已自带svn插件(插件名:Subversion Plugin-in,可在插件管理中搜索到)
2)点击 “系统管理”->“插件管理”,搜索 Deploy to container 插件,勾选,点击 “直接安装” 即可(该插件功能是集成打包后自动部署到 Web 容器中)

信步漫谈之Jenkins—集成自动化部署 SVN 项目 随笔 第2张

信步漫谈之Jenkins—集成自动化部署 SVN 项目 随笔 第3张

四、SVN 版本库配置

进入 SVN 的版本库目录 conf 文件夹下,打开 svnserve.conf 文件,修改如下配置
anon-access :定义非授权用户的访问权限,有三种方式: none 、 read 、 write ,设置为 none 限制访问, read 为只读, write 为具有读写权限,默认为 read 。
auth-access :定义授权用户的访问权限,有三种方式: none 、 read 、 write ,设置为 none 限制访问, read 为只读, write 为具有读写权限,默认为 write 。

信步漫谈之Jenkins—集成自动化部署 SVN 项目 随笔 第4张

五、Tomcat 服务器配置

1、打开 TOMCAT_HOME/conf/tomcat-users.xml 文件,添加用户配置如下

<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<user username="tomcat_user" password="123456"
roles="manager-gui,manager-script,manager-jmx,manager-status" />

2、打开 TOMCAT_HOME/conf/server.xml 文件,修改 URL 地址的编码解码字符集如下

<Connector port="8080" protocol="HTTP/1.1"
	connectionTimeout="20000"
	redirectPort="8443" URIEncoding="UTF-8"/>

3、打开 TOMCAT_HOME/bin/setclasspath.bat,在文件首部添加本地 JDK 的环境变量(指向本地安装的 Jdk1.8)

set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_121
set JRE_HOME=C:\Program Files\Java\jre1.8.0_121

六、构建完成自动部署到 Tomcat

1)打开构建项目的配置(集成测试 Demo 程序参考我另一篇博客:信步漫谈之Jenkins—集成环境搭建)

信步漫谈之Jenkins—集成自动化部署 SVN 项目 随笔 第5张

信步漫谈之Jenkins—集成自动化部署 SVN 项目 随笔 第6张

2)配置“构建后操作步骤”为“Deploy war/ear to a container”(此处需要用到前面安装的自动化部署插件),配置 Tomcat 版本以及连接 Tomcat 的用户名密码(TOMCAT_HOME/conf/tomcat-users.xml)

信步漫谈之Jenkins—集成自动化部署 SVN 项目 随笔 第7张

注意点:WAR/EAR files 的值是相对于项目工作目录的 war 包路径

七、验证自动化部署到 Tomcat

1)点击构建项目,查看控制台输出,可以看到项目已部署到 Tomcat 上

信步漫谈之Jenkins—集成自动化部署 SVN 项目 随笔 第8张

2)打开 Tomcat 日志以及 webapps 目录,可看到项目部署操作

信步漫谈之Jenkins—集成自动化部署 SVN 项目 随笔 第9张

信步漫谈之Jenkins—集成自动化部署 SVN 项目 随笔 第10张

3)访问 Tomcat 项目地址正常

信步漫谈之Jenkins—集成自动化部署 SVN 项目 随笔 第11张

八、SVN 钩子程序

配置 SVN 钩子程序的目的是实现,在 SVN 执行提交的时候,触发 Jenkins 构建并部署到 Tomcat 上的操作。
1)打开构建项目,配置构建触发器,身份验证令牌可自定义

信步漫谈之Jenkins—集成自动化部署 SVN 项目 随笔 第12张

可以看到以上的说明,Use the following URL to trigger build remotely: JENKINS_URL/job/HelloWorld/build?token=TOKEN_NAME,意思是配置“身份验证令牌”后,可以通过访问 http://192.168.1.5:8080/jenkins/job/HelloWorld/build?token=ALFRED_BUILD 这个地址,触发 HelloWorld 项目构建操作。那么显而易见,只要我们在 SVN 提交的时候,自动触发一次该 URL 地址即可。

2)下载 windows 上的 curl 命令程序(官网地址:https://curl.haxx.se/download.html),下载后解压到本地即可使用

信步漫谈之Jenkins—集成自动化部署 SVN 项目 随笔 第13张

信步漫谈之Jenkins—集成自动化部署 SVN 项目 随笔 第14张

3)打开 CMD 命令行界面,输入以下命令,验证可触发 Jenkins 构建部署操作。

"E:\Program Files\curlCmd\curl.exe" http://192.168.1.5:8080/jenkins/job/HelloWorld/build?token=ALFRED_BUILD

信步漫谈之Jenkins—集成自动化部署 SVN 项目 随笔 第15张

4)打开 SVN 的仓库目录下的 hooks 文件夹(例如我本地是:E:\Repository\SvnRepositories\repos\hooks),该目录下是 SVN 提供的事件触发程序,我们要使用到的是 post-commit.tmpl 这个文件,意思是在 commit(提交)操作时触发的事件。首先,要将钩子程序的 tmpl 后缀改为bat,这样 SVN 才可以识别到。

信步漫谈之Jenkins—集成自动化部署 SVN 项目 随笔 第16张

3)编辑 post-commit.bat 文件,注释示例程序中原有的代码,添加以上的 curl 触发命令

信步漫谈之Jenkins—集成自动化部署 SVN 项目 随笔 第17张

九、SVN 提交后自动化构建部署到 Tomcat

修改测试程序代码,并提交 SVN,自动触发构建,成功。

信步漫谈之Jenkins—集成自动化部署 SVN 项目 随笔 第18张

信步漫谈之Jenkins—集成自动化部署 SVN 项目 随笔 第19张

PS:个人觉得使用 SVN 触发自动化构建部署看起来很高大上,但是实际应用上,可能还会有许多问题,比如在多人开发、项目较赶情况下,很可能会有频繁提交 SVN 的情况,SVN 服务器和 Jenkins 服务器,不是逼死这个,就是逼死那个,这是可以预见的。

十、SVN 钩子程序(Linux 环境下)

如果 SVN 是安装在 Linux 系统中,与 Windows 上差异如下:
1)hooks 触发程序直接去掉后缀(例如:post-commit.tmpl 改为post-commit),并且需要使用 chmod 命令赋予 755 权限。
2)Linux 系统有自带的 curl 命令
执行命令格式如下:

curl -X post -v -u [Jenkins 用户名]:[Jenkins 密码] http://[服务器 IP 地址]:[服务器端口号]/jenkins/job/[Jenkins 项目名称]/build?token=[身份验证令牌]
例如:curl -X post -v -u admin:171bd768f8ff41cd8fdb7bbc5be8095d http://192.168.1.5:8080/jenkins/job/HelloWorld/build?token=ALFRED_BUILD

curl 命令参数说明:

Linux 的 curl 命令用来发送 HTTP 请求。
-X 参数: 指定请求方式
-v 参数: 显示响应结果
-u 参数: 携带用户名/密码
-H 参数: 携带请求消息头信息

十一、问题解析

1)SVN 提交代码打包,出现打包的项目非 SVN 上项目最新版本
原因:SVN 服务器和 Jenkins 服务器的时间差影响,Jenkins 的 SVN 插件是使用时间标签下载,而不是取 HEAD,因此如果 SVN 服务器的提交代码时间比 Jenkins 的当前时间晚,该代码就不会被更新。
解决:设置两个服务器之间的时间同步是一种方式,但更保稳的方式是让 Jenkins 去获取 SVN 的 HEAD 版本,我们总是打包最新版本,不是吗!配置 Jenkins 的 SVN URL加 @HEAD 后缀即可,如下。

信步漫谈之Jenkins—集成自动化部署 SVN 项目 随笔 第20张

2)在使用 Jenkins 项目构建触发 URL 时,如果提示找不到 Crumb(该问题我没有遇到,解决方案来源于网络,如有雷同,绝非巧合,我们很可能剽了同一个作者,感恩)

原因:Jenkins 默认了配置“防止跨站点请求伪造”,如下

信步漫谈之Jenkins—集成自动化部署 SVN 项目 随笔 第21张

信步漫谈之Jenkins—集成自动化部署 SVN 项目 随笔 第22张

解决:通过如下方式获取 Crumb 值,并修改 项目构建触发的 curl 命令

信步漫谈之Jenkins—集成自动化部署 SVN 项目 随笔 第23张

信步漫谈之Jenkins—集成自动化部署 SVN 项目 随笔 第24张

信步漫谈之Jenkins—集成自动化部署 SVN 项目 随笔 第25张

信步漫谈之Jenkins—集成自动化部署 SVN 项目 随笔 第26张

携带 API Token 访问下面地址:
http://admin:090d592c760bf922d554ed4b1abb2137@192.168.70.131:8080/jenkins/crumbIssuer/api/xml

信步漫谈之Jenkins—集成自动化部署 SVN 项目 随笔 第27张

则触发 Jenkins 远程构建时需要携带的请求消息头就是:
Jenkins-Crumb:5dbccaf47a86bf5b675456f58855fe16

此时,在 Linux 上使用 curl 触发构建的命令格式如下(Windows 上不知道,遇到再补充):

curl -X post -v -u [Jenkins 用户名]:[Jenkins 密码] -H "请求消息头信息" http://[服务器 IP 地址]:[服务器端口号]/jenkins/job/[Jenkins 项目名称]/build?token=[身份验证令牌]
curl -X post -v -u admin:2f6bff33bda14baba83ba1c002045f05 -H "Jenkins-Crumb:88a12946e07d82b3b0d567c7c4610c9a" http://192.168.70.131:8080/jenkins/job/ProOne/build?token=ATGUIGU_TOKEN
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄