第一篇博文java
直接開門見山的說了。python
這是件什麼事?:每次部署都是複製本地的文件粘貼到服務器端,由於路徑複雜,因此費時且手工容易出漏洞。linux
一直在想有什麼辦法能夠解決這種,由於之前在微軟的一個牛人同事作過一個腳本實現自動化部署,正巧最近在學習python,就用python寫一個自動化得腳本吧。web
1.首先是環境:SVN的版本控制,windows的本地,linux服務器。正則表達式
2.思路:應用python,代入cmd腳本,加上強大的python庫來作這件事。shell
3.再詳細的思路:apache
第一步:利用SVN的cmd下得腳本,獲取到對應版本修訂號下修改log。用正則表達式取出修改後的文件名及路徑windows
第二步:由於是java程序,這樣取出來的是xx.java文件,但須要部署上去的是編譯後的xx.class文件,因此須要取到本地編譯事後文件。tomcat
第三步:安裝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