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

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

作者: walker_liu_fei | 来源:发表于2017-04-24 11:15 被阅读0次

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

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/zgbuzttx.html