利用脚本做一个自动化更新代码和自动打包的后台任务

当工程过大,代码依赖的更新往往会是个问题。尤其是多人协作时,当你沉迷业务代码无法自拔的时候,可能你依赖的代码已经有更新。 手动svn/git更新代码是一般选择。但是这样带来的时间消耗也是相当可观的。

写好脚本

我现在的版本依赖是svn , 所以先要写好 svn的更新脚本。这是我的代码更新脚本

svn --username=fei.liu --password 123456 up .//sourcecode/carrier
svn --username=fei.liu --password 123456 up .//sourcecode/commonservice
svn --username=fei.liu --password 123456 up .//sourcecode/framework/
svn --username=fei.liu --password 123456 up .//sourcecode/gwcz/
svn --username=fei.liu --password 123456 up .//sourcecode/goodsowner/
svn --username=fei.liu --password 123456 up .//sourcecode/msgcenter
svn --username=fei.liu --password 123456 up .//sourcecode/uic
svn --username=fei.liu --password 123456 up .//sourcecode/cif
svn --username=fei.liu --password 123456 up .//sourcecode/usermanager
svn --username=fei.liu --password 123456 up .//sourcecode/wf
svn --username=fei.liu --password 123456 up .//sourcecode/financial
svn --username=fei.liu --password 123456 up .//sourcecode/wo
svn --username=fei.liu --password 123456 up .//sourcecode/tradeguide
svn --username=fei.liu --password 123456 up .//sourcecode/credit
svn --username=fei.liu --password 123456 up .//sourcecode/msgcenter
svn --username=fei.liu --password 123456 up .//sourcecode/gwhz/

详细命令可以查阅 svn命令官网简介,如果你用的是git应该更方便写更新脚本,因为git的命令方式相对于gui方式更加流行

更新换依赖的代码后需要对所依赖的代码进行打包,我们工程利用maven构建。所以现在需要打包安装到本地仓库,下面的是我的打包脚本

cd /media/walker/Works/workspace/sourcecode/commonservice/commonservice
mvn clean install -DskipTests
cd /media/walker/Works/workspace/sourcecode/tradeguide/tradeguide
mvn clean install -DskipTests
cd /media/walker/Works/workspace/sourcecode/wo/wo
mvn clean install -DskipTests
 cd /media/walker/Works/workspace/sourcecode/msgcenter/msgcenter
 mvn clean install -DskipTests
  cd /media/walker/Works/workspace/sourcecode/carrier/carrier
  mvn clean install -DskipTests
  cd /media/walker/Works/workspace/sourcecode/goodsowner/goodsowner
  mvn clean install -DskipTests
  cd /media/walker/Works/workspace/sourcecode/wf/wf
  mvn clean install -DskipTests
  cd /media/walker/Works/workspace/sourcecode/usermanager/usermanager
  mvn clean install -DskipTests
  cd /media/walker/Works/workspace/sourcecode/cif/cif
  mvn clean install -DskipTests
  cd /media/walker/Works/workspace/sourcecode/credit/credit
  mvn clean install -DskipTests
  cd /media/walker/Works/workspace/sourcecode/gwcz
  mvn clean install -DskipTests

mvn 打包,我们不需要测试,就跳过了测试。

接下来就是写一个后台运行的定时任务的脚本。这里用crontab来做一个后台任务---> crontab定时任务

这是我的定时任务脚本

#*代表所有的取值范围内的数字
#"/"代表每的意思,"/5"表示每5个单位
#"-"代表从某个数字到某个数字
#","分开几个离散的数字
#注:commands 注意以下几点

#要是存在文件,要写绝对路径
#即使是打印也不会显示在显示屏,在后台运行,最好重定向日志

# 代码更新由于消耗的时间短,可以设置的频率高一些 5分钟更新一次
*/5 * * * * sh /media/walker/Works/workspace/update.sh >>/media/walker/Works/workspace/updateinfo.txt

# 由于打包时间长,这里作品作 每30分钟一次

*/30 * * * * sh /media/walker/Works/workspace/install.sh

# TODO: 持续改进,分析更新日志,只对有更新的库进行打包

然后执行 crontab xxx.sh 开始执行脚本

总结

现在的脚本虽然可以满足基本需求,但是效率地,下一步要做的是分析更新log只对有更新的库进行重新打包

----------------------------------------------晚上下班后的更新-----------------------------------------------

经过简单的研究发现,shell 脚本的语法实在是过于复杂,在这个时候忽然想起去年接触的python!,同样是 脚本化语言。python的语法真是不知道比shell高到那里去了。所以我利用python 写了一个脚本。 通过检查svn更新日志,发现有更新的代码库,然后只重新打包这些有更新的代码库。通过这样的方式可以大大提高自动化更新代码的效率。下面试我的python脚本文件

import os
import re
from collections import deque

with open('updateinfo.txt','rt' ) as f:
 updatePaths = set() #为防止重复打包,扫描完成后在进行打包更新
 updateLine = 0
 updatingPath = ''
 for line in f:
  if (re.match('^Updating',line) != None): #以Updating开头的字符串,表示开始
   updateLine = 0 #将标识至为0
   updatingPath = line.split(" ")[1]
   updatingPath = updatingPath[1:len(updatingPath) - 3]
   moduleName = updatingPath.split("/")
   if (moduleName[len(moduleName)-1] == 'framework'):
    updatingPath = updatingPath + "/framework-parent"
   else:
    updatingPath = updatingPath + "/" + moduleName[len(moduleName)-1]
   '''
         截取最后一个 “/”后的文件夹的名字
         将名字和通用path拼接起来以后,进入到module的文件夹
         执行 mvn install -DskipTests 命令打包
   '''
  elif re.match('^At',line) != None: #repo Update 完毕,如果updateline是0 那么说明没有更新
   if(updateLine <= 0):
    continue
  elif re.match('^Updated',line): #以Updated  开头的表示有更新!
    updatePaths.add(updatingPath)
  else:
    updateLine += 1
 print(updatePaths)
 for updatingPath in updatePaths:
    print(updatingPath)
    os.environ['path'] = str(updatingPath)
    os.chdir(updatingPath) #change the working dirctory
    os.system('mvn install -DskipTests')

然后就是更新自动化任务的脚本。

# minute hour day_of_month month_of_year
#*代表所有的取值范围内的数字
#"/"代表每的意思,"/5"表示每5个单位
#"-"代表从某个数字到某个数字
#","分开几个离散的数字
#注:commands 注意以下几点

#要是存在文件,要写绝对路径
#即使是打印也不会显示在显示屏,在后台运行,最好重定向日志

# 代码更新由于消耗的时间短,可以设置的频率高一些 3分钟更新一次
*/3 * * * * /media/walker/Works/workspace/update.sh >/media/walker/Works/workspace/updateinfo.txt

# 由于打包时间长,这里作品作 每4分钟执行检查文件的任务

*/4 * * * * python3.5 /media/walker/Works/workspace/readUpdateInfo.py

第二次总结

虽然写这个脚本花了 不少时间,尤其是对Python的掌握还不是很熟悉,但是凭借着Python简洁的语法,还是在今天离开公司前把这个事情搞定了。我是感觉做这个事情是值得的,不仅提高了工作效率,还学了不少东西!

OK ! 下班!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,107评论 19 139
  • 今天小长假第一天到惠州一个朋友家玩,结果朋友说昨天遭客户投诉今天加班,我们就在他家和他们宝宝玩,和他妈妈聊天,结果...
    云沐妈妈阅读 182评论 0 0
  • 其实开心,难过总是围绕着你我,只是有些人伪装得很好,有些人直接表现出来。 我只是一个例外,总...
    27202c0fbbd8阅读 170评论 0 1