首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

SVN自动化2

SVN自动化2

上一篇考虑到字数问题,所以就将自动化的内容放到新的一篇中,这里我们先使用shell命令实现一个简单自动上传代码。

简单而言需求是希望通Jenkins将svn提交的流程自动化,下面简单讨论一下,首先属性一下SVN常用命令,然后自动化提交(一个比较大的资源项目(2G多)公司使用SVN管理,此前是手动SVN处理,现在要集成在Jenkins中自动化)

开发环境:Mac OSPython 2.7 (使用了2.7的commands库来执行shell,可以通过os.system替换一下则实现python3的兼容)

SVN常规命令

我将我常用的SVN命令简单展示一下,如下:

需要注意的是,删除权限需要在SVN服务端配置,默认的配置方法只能给予相应用户读写权限,但不包括删除权限。

自动化

因为历史原因,旧的架构使用SVN来管理2G多的资源包,2G,可想而知,光checkout下来都要一段时间,而如果是第一次将2G的资源包上传,也需要非常多的时间,这里通过简单的脚本将整个上传、更新等流程自动化,先来实现一个shell版本的,整个逻辑非常简单,即将不同的SVN命令连贯起来使用,代码如下:

整个shell脚本,首先会判断传入的path路径是否存在,如果不存在,则去checkout SVN服务器上相应url对应的工作区间,checkout会自动创建目录,所以我们的shell命令不需要再次创建,如SVN上的有名为A的项目,此时如果你先创建了A,然后再在A文件夹中checkout A项目,SVN会自动在A文件夹下再创建A文件夹用来存放文件,这样显得多次一举。

如果path路径已经存在,则说明此前已经checkout过了,此时第一步使用revert命令还原当前工作副本所做的操作,这是因为资源项目是不会轻易修改的,如果在提交前新内容前提交空间中已经有要提交的内容是不行的,所有revert一下,这里使用了 表示revert整个项目目录,revert会将所有加入到期提交空间中的内容都撤销,即回滚修改操作,当revert执行完后,使用update命令更新本地工作副本的代码,做完这两步后,再自动将内容填充到工作副本中,我将字段代码删除了,其实就是简单cp或mv操作,因为具体的项目设计的路径不同,这段代码没有通用性。

这些步骤完成后,就调用svncommit方法,该方法中会打印一下时间,用来判断每个步骤执行了多久,代码中两种提交svn的方法,分别是:

通过实验,发现两者在运行时间上没有多少差异。

至此shell版本的SVN自动提交脚本就完成了

python实现SVN分块提交

因为资源比较大,所以我担心一个问题,即add添加了很多内容后,进行commit操作时,如果commit到了一半,出现了问题,比如网络不稳定等外界因素导致的问题,此时commit就会发生回滚,具参考资料说,commit是原子操作,如果commit没成功,会回滚整个操作不会存在提交了一半,另一半没有提及的情况,而第一种形式使用shell来实现svn提交,虽然已经自动化,但大的资源项目提交,如果中途网络不稳定等情况,那么提交的内容就失效,因为资源比较大,提交比较耗时,此时又要重来一遍,会非常蛋疼,所以使用python封装一下SVN命令,实现分块提交。

所谓分块提交,其实就是每次提交一部分,比如我设置的块大小为10M为一块,那么此时add了10M大小左右的文件后,就会提交一次SVN,如果SVN commit断开了,此前提交的内容就不会被回滚。下面来写一下相关的code。

首先编写一下入口方法,如下:

main()方法的整体逻辑与shell中一样,如果path不存在,则ckeckout一下,如果存在,则revert与update,然后我将要跟新的资源文件解压并移动到相关目录下,接着调用getstllist()方法获得要add的文件列表,这些文件以tuple形式存在队列中,每个tuple都由文件大小与文件路径组成,然后循环获取队列中的元素,如果获得的元素大小大于10M了,则提交。

checkout、revert、update等方法比较简单,这里直接看getstllist()方法,如下:

该方法调用status()方法获得svn要提交的内容,status()方法背后其实就是 命令,获得带有 标识的文件,这些文件就是新加的问题,而如果是修改了已存在的文件,其标识为 ,修改的文件不必使用svn add来添加,因为他们已经在要提交空间中了。

通过getstllist()方法将所有要添加到提交空间的文件添加到 队列中后,再逐个使用他们。

接着看到add()方法,svn add的要求会比较多,比如父目录没有add进提交空间,该目录下的子文件是无法add进提交空间的,这些逻辑都需要在add()方法中处理,代码如下:

add中的多种情况都是我在开发过程中遇到的,所以都分别作了处理,为了避免死递归,这里如果一个错误重复出现了8次,那么就不再继续递归,将该错误记录到文件中,然后期人来查看,整个程序不受该文件影响继续执行svn add的逻辑。

最后就是commit逻辑了,代码如下:

commit()方法整体比较简单,执行运行则可。

小结

SVN的了解就到这里了,其实服务端还有很多配置可以操作,可以自行查资料了解,上述的shell code与python code都提交到了github上,地址为:

https://github.com/ayuLiao/autosvn

欢迎关注:hackpython

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181221G0AL0T00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券