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

当工程过大,代码依赖的更新往往会是个问题。尤其是多人协作时,当你沉迷业务代码无法自拔的时候,可能你依赖的代码已经有更新。 手动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 ! 下班!

你可能感兴趣的:(利用脚本做一个自动化更新代码和自动打包的后台任务)