zoukankan      html  css  js  c++  java
  • 信步漫谈之Jenkins—集成自动化部署 SVN 项目

    一、环境准备

    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 项目流程图

    image

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

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

    clipboard

    image

    四、SVN 版本库配置

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

    clipboard[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 FilesJavajdk1.8.0_121
    set JRE_HOME=C:Program FilesJavajre1.8.0_121

    六、构建完成自动部署到 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 包路径

    七、验证自动化部署到 Tomcat

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

    image

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

    image

    image

    3)访问 Tomcat 项目地址正常

    image

    八、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 FilescurlCmdcurl.exe" http://192.168.1.5:8080/jenkins/job/HelloWorld/build?token=ALFRED_BUILD

    image

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

    image

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

    1556376758(1)

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

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

    image

    image

    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 后缀即可,如下。

    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
  • 相关阅读:
    poj1113--凸包(Andrew)
    php变量内存完全释放
    php的内存分配还是很智能的
    git 忽略权限记录一下
    开启事务处理插入多条数据 速度也可以
    var_dump(is_writeable(ini_get("session.save_path")));
    要注意一下xss攻击啊
    select *," as A from B union ...
    多次踩坑
    js instanceof运算符
  • 原文地址:https://www.cnblogs.com/alfredinchange/p/10742969.html
Copyright © 2011-2022 走看看