python+paramiko庫+svn寫的自動化部署腳本

 

第一篇博文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
相關文章
相關標籤/搜索