首页 > Python > python实时监控SVN的提交的数据库脚本,并校验脚本语法的正确性

python实时监控SVN的提交的数据库脚本,并校验脚本语法的正确性

2018年1月28日 发表评论 阅读评论

最近由于某种原因,想写一个小程序,能够实时获取到SVN的提交记录,并检验提交的脚本是否合法,防止上版时才发现语法错误。

首先需要安装一个SVN服务器,直接参考下面的资料就好了

http://www.techoism.com/how-to-configure-svn-server-on-centosrhel/

我用的是Redhat7,其实只要安装好了Yum大部分的安装都是一键安装,需要注意的是文件的权限,我是用root用户安装的,新建的文件属于root用户,在提交SVN记录时会发现没有写的权限,改一下文件的权限就好了。

虽然Python有对SVN支持,但感觉功能都比较简单,不能满足我的需求,SVN本身提交的命令比较多,于是通过Python直接调用SVN的命令来实现

第一步首先是要获取增量的SVN记录

[root@localhost test]# svn help list
Valid options:
-r [--revision] ARG : ARG (some commands also take ARG1:ARG2 range)
A revision argument can be one of:
NUMBER revision number
'{' DATE '}' revision at start of the date
'HEAD' latest in repository
'BASE' base rev of item's working copy
'COMMITTED' last commit at or before BASE
'PREV' revision just before COMMITTED

     通过r似乎是可以获取增量提交的SVN记录,可是很遗憾,NUMBER 版本号这个选项只能选择某个要结束的版本号,起始版本号永远是0,不支持自定义的区间选择。'{' DATE '}' 文档解释是开始的时间,但通过验证发现是截止到该时刻的记录,和NUMBER的选项基本一致了。直接的方法不行,只能曲线救国了。

[root@localhost test]# svn help log
log: Show the log messages for a set of revision(s) and/or path(s).
Valid options:
-r [--revision] ARG : ARG (some commands also take ARG1:ARG2 range)
A revision argument can be one of:
NUMBER revision number
'{' DATE '}' revision at start of the date
'HEAD' latest in repository
'BASE' base rev of item's working copy
'COMMITTED' last commit at or before BASE
'PREV' revision just before COMMITTED

     svn log -r 参数和 svn list –
r
参数是一样的,然后不同的是NUMBER'{' DATE '}'都是之前区间查询的。

[root@localhost techoism]# svn log -v --xml -r15:16
<?xml version="1.0" encoding="UTF-8"?>
<log>
<logentry
   revision="15">
<author>steve</author>
<date>2018-01-27T13:30:45.588327Z</date>
<paths>
<path
   action="M"
   prop-mods="false"
   text-mods="true"
   kind="file">/test.sql</path>
</paths>
<msg>correct</msg>
</logentry>
<logentry
   revision="16">
<author>steve</author>
<date>2018-01-27T13:37:10.897772Z</date>
<paths>
<path
   action="A"
   prop-mods="false"
   text-mods="true"
   kind="file">/dept.sql</path>
</paths>
<msg>create dept table</msg>
</logentry>
</log>

日志里记录的提交的作者,文件名,操作类型等。基本上通过解析日志就好。

还有就是日志里记录的是GMT时间,在使用日期区间查询时,要特意小心,网上也有人在质疑这个是不是一个BUG,但现在还是这样的。

第二步就是开始解析日志,因为可以设置日志生成的格式是XML,具体怎么用Python解析XML直接照着官方文档做就好了。

第三步开始验证脚本的正确性,虽然工作中用的是Oracle数据库,但考虑的虚拟机的配置问题,直接用mariadb(mysqloracle收购后,Redhat7开始默认提供mariadb的安装包)代替好了,基本的思路都是一样的。就是在命令行里运行一下脚本,看是否有报错就好了。

(Oracle,SQLPLUS来代替)

例如我有一个脚本

[root@localhost techoism]# more test.sql
delete from emp;
insert into emp(id, name) values(2,"lisi");
insert into emp(id, name) values(3,"wangwu");
insert into emp(id, name) values(4,"lili");
commit;

[root@localhost techoism]# mysql -uroot
-proot -Dtest<test.sql

修改一下脚本,改成一个不存在的表,重新运行

[root@localhost techoism]# mysql -uroot
-proot -Dtest<test.sql

ERROR 1146 (42S02) at line 1: Table
'test.empp' doesn't exist

此时就应该要把错误信息输出到错误日志中,及时提醒对应的开发人员,提交的脚本有问题,并及时修改。

第四步验证效果

先开第一个终端监控错误日志:

tail -f err.log

再开一个终端运行脚本

[root@localhost python_code]# python3
read_log.py

再开第三这个终端提交一个错误的脚本

[root@localhost techoism]# svn commit -m
"error log test"

Sending    
   test.sql

Transmitting file data .

Committed revision 18.

查看第一个终端的错误日志窗口:

完整带代码托管到了GitHub地址:
https://github.com/angu204/python_code/blob/master/read_log.py
后记:希望能优化错误日志的信息,并能自动发邮件给对应的脚本作者。

     

分类: Python 标签: ,
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.