第一篇博文
直接开门见山的说了。
这是件什么事?:每次部署都是复制本地的文件粘贴到服务器端,因为路径复杂,所以费时且手工容易出漏洞。
一直在想有什么办法可以解决这种,因为以前在微软的一个牛人同事做过一个脚本实现自动化部署,正巧最近在学习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 = ‘118.244.204.239‘ 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
原文:http://www.cnblogs.com/debude/p/5105590.html