前言:目前svn hook+远程构建jenkins+导表规则检查的详细设计还没有看到有具体的博文,所以这里提供一下我在这方面的具体设计过程,供大家参考,如果有更好的设计流程或者建议,请留言给我,感谢感谢!
1、搭建本地仓库
本地创建local_repository文件夹,然后在文件夹下右击选择TortoiseSVN>Create repository here创建本地仓库
创建完,进入local_repository文件夹下面,可以看到已经生成了许多文件,启动db就是仓库的存储数据库,可以不用理会,hooks下面是svn hooks的各种钩子文件。
这里介绍一下conf、hooks里面每个文件的功能:
文件名 | 描述 |
conf/password | 用户文件,配置用户和密码 |
conf/authz | 用户权限文件,用于配置用户权限 |
conf/svnserver.conf | 配置启动参数 |
hooks的文件:
文件名 | 描述 |
post-commit.tmpl | 提交完成后执行,需要传递2个参数:1.版本库路径,2.提交事务的名称 |
post-lock.tmpl | 文件加锁后执行,通常用来发送锁定事件通知,需要传递两个参数给hooks脚本:1.版本库路径,2.锁定路径的认证用户名 |
post-revprop-change.tmpl | 在修改revision属性之后执行 |
post-unlock.tmpl | 文件解锁后执行 |
pre-commit.tmpl | 提交之前执行,在start-commit之后,通常用来对提交内容的检查,需要传递两个参数给hooks脚本:1.版本库路径,2.提交事务的名称 |
pre-lock.tmpl | 文件加锁前执行 |
pre-revprop-change.tmpl | 在修改revision属性之前执行 |
pre-unlock.tmpl | 文件解锁前执行 |
start-commit.tmpl | 始提交时执行,在pre-commit之前,通常用来确定用户是否有提交权限 |
添加svn用户
这里建议先安装一个visualsvn server管理软件,具体怎么安装这里不再介绍。
启动svn server,软件界面如下所示
在Repositories下面如果是仓库,在图标的左上角会有个红色星号。
下面有个Users文件夹,右击创建用户
创建完后,在仓库里面右击>properties(属性),会弹出属性界面
在属性界面中,第一个tag是人员管理设置,可以配置人员的读写权限,增删人员等操作。
2、配表规则
3、架构设计
项目设计的架构如下,客户端提交文件到仓库后,同时触发远程Jenkins的构建,构建的任务进行checkout提交并且进行规则检查,如发现有异常的提交,则推送内容到本地端
代码设计
(1)svn相关指令的使用
svn指令中需要用到的指令有:
客户端指令:svn info --show-item revision(获取版本号)、svn log -r 版本号 -v(获取提交的文件内容)
其中需要注意的一点是svnlook并不适用与客户端,svnlook这个指令应该是服务端仓库那边使用的,在客户端这边应该是用不了,特别是在有远程仓库的情况下是不适用的,因为SVNlook changed指令后面接的参数是仓库路径参数path,远程仓库情况时是没办法获取的。比较好的方法是使用svn指令,该指令是svn客户端下使用,在需要查看提交log中提交了哪些文件时,使用svn log还不行,svn log此时显示的仅仅能获取的是svn提交版本号、作者、时间这三个数据,也就是showlog窗口下显示的上半部分的内容,而想要显示具体的文件名字,则需要在后面添加版本号和-v,最后的格式如:svn log -r 某版本号 -v
有这样的一个疑问:为什么svn log没有显示刚提交的日志?
解答:如果在提交之后马上不带参数地执行 svn log,用户就会发现输出的日志消息中没有包含最近的几次提交,这种情况是由 svn commit和svn log的共同作用的结果. 首先,用户向仓库提交修改时, svn只更新了被提交的文件和目录的版本号,但是父目录依然是较旧的版本号,svn log默认从目录的当前版本号开始获取历史消息,所以用户就看不到刚提交的日志.解决办法是用svn update更新工作副本, 或通过选项-r显式地向svn log传递一个版本号
下图是获取提交的版本号
下图是获取某版本提交的文件名
(2)代码逻辑
获取提交文件名的逻辑
得到svn的文件格式如下:
前面开头的参数说明:
M:文件有修改
A:新增文件,(from xxx:版本号)表示该文件从另外一个文件修改而来
D:删除的文件,仓库中已经不存在该文件了
当然还有其他的参数,比如R、?、!、~、I这些,但是几乎不涉及到,所以这里不做多介绍。
svn hook配置
svn hook使用的是post commit来控制,在仓库>hooks路径下,创建post-commit.bat批处理文件,并保存为ANSI编码格式。
在post-commit里面的代码内容如下:
先设置python执行路径,有些情况下,无法直接使用python py文件的方式来执行python文件,所以我这里配置了python文件,置于其他具体的bat代码语法可以自行网上搜索查看。
此处所做的事情是创建jenkins对象并构建一个名为CheckTable的job,执行该bat后,会触发本地机器上jenkins进行构建CheckTable
这里需要下载python-jenkins依赖包,注意别下载了jenkins依赖包,他们两个是同名的不同依赖。
在checkdata.py里面,username是jenkins的账户名,password是用户名token。在用户列表里面的api token里面生成token。
在jenkins里面,构建时调用jenkins.py文件进行svn checkout/update后并检查规则,最后输出报告等内容。
jenkins.py中的核心逻辑代码,其中handerexcel.py是Excel读取逻辑,checkRule.py是表格规则检查,这里就不多黏贴了,因为不同项目的导表规则不一样。
4、Jenkins环境搭建
(1)下载Jenkins
Jenkins的下载地址https://jenkins.io/zh/
下载的msi文件可以进行安装
(2)启动Jenkins服务
安装好Jenkins后,进入Jenkins的安装目录,进入cmd模式使用指令:
java -jar Jenkins.war --httpPort=8080
如果启动Jenkins时,有报如下的报错时,说明机器上的jdk版本与Jenkins要求的版本不一致所致,最新版的Jenkins支持的jdk版本在[8,11],超过或者低于这个范围的jdk版本都不能启动成功,需要重装jdk版本
重装jdk并配置好jdk的环境变量后,重新启动Jenkins
http://localhost:8080进入网页打开界面如下
安装插件,选择推荐安装的插件模式,进入会自动安装各种常用的插件,安装插件的过程,会自动安装各种依赖。
创建一个job,名字名为checktable
不用触发器,不用代码,在构建里面使用window cmd指令执行响应的代码
配置构建后发送邮箱
邮箱配置
进入jenkins【系统设置】
配置Extended E-mail Notification
下面的默认即可,然后配置邮箱通知
5、构建过程中常见的问题
(1)、svn hook提交后,报拒绝访问
原因:由于svn server默认的用户是网络服务器账户,该账户没有处理bat文件的权限
解决方法:
去到【服务】里面将下面两个服务的账户改为当前计算机账户即可
具体的操作如下图所示
(2)jenkins配置邮箱时,测试不成功,报如下的错误
原因:可能是系统管理员邮箱地址没有设置或者设置与发送邮箱不一致
解决方法:尽量配置管理员邮件地址与下面的发送邮箱地址一致。
(3)截取build log使用BUILD_LOG_MULTILINE_REGEX方法只能显示匹配的行,不能显示内容
解决方法:使用BUILD_LOG_REGEX类替代
(4)截取的build log内容发送到邮箱里面的格式是乱的
解决方法:这是由于截取内容有HTML没有按照原格式输出导致的,只需要在内容中添加<pre></pre>标签即可
修改后的格式:
(5)邮箱每一次构建都会发送
原因:发送邮箱的内容使用的是python print出来的错误内容,python脚本没有额外的中端操作。
解决方法:在python脚本中根据是否存在print日志来决定是否要主动中断,即使用exit(1)来创建一个中断码给操作系统,jenkins里面通过errorlevel来获取该码来判断是否是成功还是失败。
python脚本添加如下返回判断
jenkins里面的batch脚本内容添加如下判断
这样一来,只要有python print的日志,那么我就主动让jenkins构建失败来创建失败邮件,而如果print内容为空的话,我就认为build成功的,不发送邮件。