信步漫谈之Jenkins—集成自动化部署 SVN 项目

1、环境准备

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—集成环境搭建html

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

image

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

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

clipboard

image

4、SVN 版本库配置

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

clipboard[4]

5、Tomcat 服务器配置

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

<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" />

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

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

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

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

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

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

image

image

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

image

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

7、验证自动化部署到 Tomcat

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

image

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

image

image

3)访问 Tomcat 项目地址正常

image

8、SVN 钩子程序

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

image

能够看到以上的说明,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),下载后解压到本地便可使用

1556372092(1)

image

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

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

image

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

image

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

1556376758(1)

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

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

image

image

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

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

若是 SVN 是安装在 Linux 系统中,与 Windows 上差别以下(我使用的是 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 参数: 携带请求消息头信息

11、问题解析

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

image

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

缘由:Jenkins 默认了配置“防止跨站点请求伪造”,以下

image

image

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

image

image

image

image

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

image

则触发 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
相关文章
相关标签/搜索