python+paramiko库+svn写的自动化部署脚本

 

第一篇博文

直接开门见山的说了。

这是件什么事?:每次部署都是复制本地的文件粘贴到服务器端,因为路径复杂,所以费时且手工容易出漏洞。

一直在想有什么办法可以解决这种,因为以前在微软的一个牛人同事做过一个脚本实现自动化部署,正巧最近在学习python,就用python写一个自动化得脚本吧。

1.首先是环境:SVN的版本控制,windows的本地,linux服务器。

2.思路:应用python,代入cmd脚本,加上强大的python库来做这件事。

3.再详细的思路:

        第一步:利用SVN的cmd下得脚本,获取到对应版本修订号下修改log。用正则表达式取出修改后的文件名及路径

        第二步:因为是java程序,这样取出来的是xx.java文件,但需要部署上去的是编译后的xx.class文件,所以需要取到本地编译过后文件。

        第三步:安装python paramiko库.

        第四步:just build and run it

  1 __author__ = 'Administrator'
  2 # coding:utf8
  3 import os
  4 import re
  5 
  6 url = "svn://192.168.30.111/ZXJY_ALL"
  7 localPath = 'E:\quanli360\项目'
  8 vision_num = raw_input('type a vision num: ')
  9 
 10 # 需要运行SVN的命令
 11 svn_command = 'svn log ' + localPath + '\p2p_standard_2.0_quanli -r ' + vision_num + ' -v'
 12 #转码让system执行得时候可以适应中文
 13 svn_command = svn_command.decode("utf-8").encode("gbk")
 14 print 'run shell is===', svn_command
 15 #执行svn_command
 16 a = os.popen(svn_command).read()
 17 
 18 print a
 19 #正则取出版本号得更新文件路径
 20 print "取出文件路径:"
 21 def regPath(strPath):
 22     reg = 'p2p_standard_2.0_quanli\\s*\\w*\\W*\\S*'
 23     regCom = re.compile(reg)
 24     pathList = re.findall(regCom, strPath)
 25     #print pathList
 26     return pathList
 27 
 28 res = regPath(a)
 29 print '=='*60
 30 
 31 def regPathC(strPath):
 32     reg = '\\com\\\\s*\\w*\\W*\\S*'
 33     regCom = re.compile(reg)
 34     pathList = re.findall(regCom, strPath)
 35     #print pathList
 36     return pathList
 37 
 38 def regPathS(strPath):
 39     reg = '\\site\\\\s*\\w*\\W*\\S*'
 40     regCom = re.compile(reg)
 41     pathList = re.findall(regCom, strPath)
 42     #print pathList
 43     return pathList
 44 
 45 #sftp命令上传至服务器,<目前只能先删除待更新文件,再上传文件过去>
 46 import paramiko
 47 
 48 username = 'work'
 49 password = 'Ex42tko4{G4NT@{^'
 50 hostname = 'XXX.XXX.XXX.XXX'
 51 port = 2022
 52 
 53 
 54 def deployServer(locath, objPath):
 55     try:
 56         t = paramiko.Transport((hostname, port))
 57         t.connect(username=username, password=password)
 58         sftp = paramiko.SFTPClient.from_transport(t)
 59         #rename
 60         sftp.remove(objPath)
 61         print 'Now start'
 62         sftp.put(locath, objPath)
 63         print 'good'
 64         print '=='*60
 65         t.close();
 66     except Exception, e:
 67         import traceback
 68         traceback.print_exc()
 69         try:
 70             t.close()
 71         except:
 72             pass
 73 
 74 # 如果一个版本号下多个文件挨个取出并补全路径,执行部署
 75 for x in range(len(res)):
 76     realLocPath = localPath + '\\' + res[x]
 77     realLocPath = realLocPath.replace("/", "\\")
 78     print (realLocPath)
 79     print '=='*60
 80     if realLocPath.__contains__("\\com\\"):
 81         cutStr = regPathC(realLocPath)
 82         cutStr = ''.join(cutStr)
 83         #匹配本地编译后的文件
 84         cutStr = cutStr.replace(".java", ".class")
 85         realLocPath = "E:\\apache-tomcat-6.0.37\\webapps\\archer\\WEB-INF\\classes\\" + cutStr
 86         cutStrL = cutStr.replace("\\", "/")
 87         objectPath = "/home/work/tomcat_instances/quanli360.com-instance-3/webapps/archer/WEB-INF/classes/" + cutStrL
 88         print 'Source:-->',realLocPath
 89         print 'Server:-->',objectPath
 90         deployServer(realLocPath,objectPath)
 91     elif realLocPath.__contains__("\\site\\"):
 92         print 'start site'
 93         cutStr = regPathS(realLocPath)
 94         print cutStr
 95         cutStr = ''.join(cutStr)
 96         realLocPath = 'E:\\apache-tomcat-6.0.37\\webapps\\archer\\site' + cutStr
 97         objectPath = '/home/work/tomcat_instances/quanli360.com-instance-3/webapps/archer/' + cutStr
 98         cutStrL = cutStr.replace("\\", "/")
 99         objectPath = '' + cutStrL
100         print cutStr,realLocPath, objectPath
101         # deployServer(realLocPath,objectPath)
102     else:
103         print ("no contains")
104     # deployLoc(realLocPath)
105 
106 print '=='*60

 

posted @ 2016-01-06 14:49  嘚不嘚  阅读(780)  评论(0编辑  收藏  举报