一、环境准备

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. 有关svn的报错

    由于目标计算机积极拒绝,无法连接.当报出这样的错的时候就是跨域的问题

  2. css样式兼容各个浏览器时的部分总结

    [本文基本是在网络转发过来的,网站就忘记了,这文本都是保存在自己电脑本地的,还有些自己添加了些内容,这内容还会有不断的完善和更行的] 什么是浏览器兼容:当我们使用不同的浏览器(Firefox IE7 ...

  3. HttpClient学习--HttpClient的POST请求过程源码解读

    众所周知,HttpClient是对JDK net包下网络相关操作的一个封装,所以阅读的前提待知道HttpClient底层肯定是通过Socket来进行网络通信的. 下面来简单的捋一下代码,在进入繁杂.深 ...

  4. 总结-shell脚本

    执行脚本从 svn 检出项目 vi ace.sh #!/bin/bash svn export svn://127.0.0.1/ace/demo /ace/demo 设置脚本可执行 chmod +x ...

  5. MYSQL定时任务 触发器

    流程: 查看时间调度器是否开启,OFF关闭,ON开启 SHOW VARIABLES LIKE 'event_scheduler' 设置开启 set GLOBAL event_scheduler = 1 ...

  6. dynamic 类型不能访问属性

    x //解决方案ProjectTest.项目A里面public object r(){ ,name = "zf"}; } //解决方案ProjectTest.项目B里面 publi ...

  7. [math] 什么是双曲函数(转发)

    我完全不记得上高中的时候学习过双曲函数...额,暴露了... 原文地址:https://zhuanlan.zhihu.com/p/20042215 可能是最好的讲解双曲函数的文章 零.写在前面 (近期 ...

  8. 初识springboot

    一.springboot简介: 1.简化spring应用开发框架 2.把spring所有技术整合在了一起 3.J2EE开发的一站式解决方案 我曾经学习springMVC时候,那许许多多的配置文件的配置 ...

  9. ThinkPHP安全规范指引

    流年 发布于 ThinkPHP官方博客: https://blog.thinkphp.cn/789333 本文主要和大家探讨一下ThinkPHP的安全注意事项,可以作为ThinkPHP建议的安全规范实 ...

  10. 极客时间 深入拆解java虚拟机 一至三讲学习总结

    为什么要学习java虚拟机 1.学习java虚拟机的本质,是了解java程序是如何被执行且优化的.这样一来,才可以从内部入手,达到高效编程的目的.与此同时,你也可以为学习更深层级.更为核心的java技 ...