一、环境准备

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 自动化部署插件安装

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


四、SVN 版本库配置

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


五、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—集成环境搭建)

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

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

七、验证自动化部署到 Tomcat

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

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

3)访问 Tomcat 项目地址正常

八、SVN 钩子程序

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

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

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

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

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

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

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

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

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

十、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 参数: 携带请求消息头信息

十一、问题解析

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

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

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

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

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

则触发 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

信步漫谈之Jenkins—集成自动化部署 SVN 项目的更多相关文章

  1. Jenkins自动部署Tomcat项目

    Jenkins自动部署Tomcat项目 1.安装jenkins 插件 启动Jenkins,进入系统管理-插件管理: 选择Deploy to container Plugin 插件安装:

  2. CentOS7安装Jenkins自动化部署maven项目

    前言: 最近要弄一个jenkins工具,已经安装好了并且jenkins使用部署项目的流程已经基本走通,上图: 话不多说,开始 第一步:安装jenkins: [ 准备环境: 在centOS7环境上:安装 ...

  3. Jenkins自动化部署war项目

    基于上一篇Jenkins安装环境,下面对自动打包部署做个备忘 1.安装:Publish over SSH 插件 2.安装完成后,进入下图配置 ↓↓↓ 3.翻到底下↓↓↓ 找到刚刚安装的Publish ...

  4. 使用jenkins自部署Coding项目

    下载安装jenkins 下载地址:https://jenkins.io/download/ 安装后通过主机的8080端口进行程序设置,插件安装默认的就好 Jenkins项目目录:C:\Program ...

  5. Jenkins进阶-部署Web项目到远程tomcat(7)

    之前讲到的是如何构建一个项目,并且将代码进行编译.打包,那么打包完成最后的结果就需要发布到应用服务器,将项目部署成功.在之前的项目中我们采用的shell脚本来部署,下面讲解通过Jenkins部署web ...

  6. 信步漫谈之Jenkins—集成环境搭建

    一.环境准备 1)Jenkins 部署 WAR 包:jenkins.war(2.164.2 版本,WAR 包官方下载路径:https://jenkins.io/download/)2)Tomcat 服 ...

  7. Jenkins自动部署springboot项目

    说明: 该示例为在windows系统下自动化部署springboot 架构: springboot + github + gradle + jdk8 各种配置步骤及截图说明: 1.配置git,grad ...

  8. jenkins集成自动化部署插件(一) deploy-plugin

    在实际情况中项目构建成功,特别是web项目构建成功是需要将war放到对应的服务上面,进行运行(测试的阶段可能就是发布到测试服务器上面)这样只需要指定构建的触发策略就可以自动构建以及部署,省去不少人工的 ...

  9. Linux安装Jenkins并部署springboot项目

    安装步骤: 1.跳转连接https://pkg.jenkins.io/redhat-stable/下载安装包 2.安装命令: sudo rpm -ih jenkins-2.73.2-1.1.noarc ...

随机推荐

  1. Chrome_查看 webSocket 连接信息

    1.以下代码实现一个webSocket连接,在文本输入框中输入内容,点击发送,通过服务器,返回相同的内容显示在下方. <!DOCTYPE html> <html lang=" ...

  2. 关于*.ashx 处理程序调试时 未能创建类型 错误

    出现改问题的根本原因是因为,我更改过改类型的名字,而IDE并没有更改  ***.ashx. 注册类型名字. 所更改的类的名字应该是  "项目名字.文件名字“ 例如下图 应该更改类为 ”Wx_ ...

  3. CentOS裸机环境下安装php-7.3.1

    安装步骤如下 安装必要的软件 获取源码 编译安装 安装过程可能遇到的一些问题 编译参数详解 安装步骤如下 安装必要的软件 yum install -y autoconf automake libtoo ...

  4. Sql中获取表结构(字段名称,类型,长度,说明)

    Sql中获取表结构(字段名称,类型,长度,说明) SELECT TableName = OBJECT_NAME(c.object_id), ColumnsName = c.name, Descript ...

  5. C# 换行

    要让一个Windows Form的TextBox显示多行文本就得把它的Multiline属性设置为true.  要让TextBox里面的文本换行大家往往会想到直接在要换行的地方加个转义的换行符&quo ...

  6. laravel的日志权限

    命令行脚本运行时报错 UnexpectedValueException  : The stream or file "/Data/PMS/storage/logs/laravel-2019- ...

  7. 在队列中join()与task_done()的关联性

    1.基础解释: Queue.task_done() 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号 Queue.join() 实际上意味着等到队列为空,再执 ...

  8. 2018-2019-2 网络对抗技术 20165225 Exp6 信息搜集与漏洞扫描

    2018-2019-2 网络对抗技术 20165225 Exp6 信息搜集与漏洞扫描 实践内容 (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口扫描.O ...

  9. 深度学习基础(四) Dropout_Improving neural networks by preventing co-adaptation of feature detectors

    该笔记是我快速浏览论文后的记录,部分章节并没有仔细看,所以比较粗糙. 从摘要中可以得知,论文提出在每次训练时通过随机忽略一半的feature detectors(units)可以极大地降低过拟合.该方 ...

  10. hdfs常用的命令

    查看hadoop的状态hdfs haadmin -getServiceState nn1切换主从 hdfs haadmin -failover nn1 nn2查看hdfs是否安全模式hdfs dfsa ...