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

__author__ = 'Administrator'
# coding:utf8
import os
import re

url = "svn://192.168.30.111/ZXJY_ALL"
localPath = 'E:\quanli360\项目'
vision_num = raw_input('type a vision num: ')

# 需要运行SVN得命令
svn_command = 'svn log ' + localPath + '\p2p_standard_2.0_quanli -r ' + vision_num + ' -v'
#转码让system执行得时候可以适应中文
svn_command = svn_command.decode("utf-8").encode("gbk")
print 'run shell is===', svn_command
#执行svn_command
a = os.popen(svn_command).read()

print a
#正则取出版本号得更新文件路径
print "取出文件路径:"
def regPath(strPath):
    reg = 'p2p_standard_2.0_quanli\\s*\\w*\\W*\\S*'
    regCom = re.compile(reg)
    pathList = re.findall(regCom, strPath)
    #print pathList
    return pathList

res = regPath(a)
print '=='*60

def regPathC(strPath):
    reg = '\\com\\\\s*\\w*\\W*\\S*'
    regCom = re.compile(reg)
    pathList = re.findall(regCom, strPath)
    #print pathList
    return pathList

def regPathS(strPath):
    reg = '\\site\\\\s*\\w*\\W*\\S*'
    regCom = re.compile(reg)
    pathList = re.findall(regCom, strPath)
    #print pathList
    return pathList

#sftp命令上传至服务器,<目前只能先删除待更新文件,再上传文件过去>
import paramiko

username = 'work'
password = 'Ex42tko4{G4NT@{^'
hostname = '118.244.204.239'
port = 2022


def deployServer(locath, objPath):
    try:
        t = paramiko.Transport((hostname, port))
        t.connect(username=username, password=password)
        sftp = paramiko.SFTPClient.from_transport(t)
        #rename
        sftp.remove(objPath)
        print 'Now start'
        sftp.put(locath, objPath)
        print 'good'
        print '=='*60
        t.close();
    except Exception, e:
        import traceback
        traceback.print_exc()
        try:
            t.close()
        except:
            pass
        
# 如果一个版本号下多个文件挨个取出并补全路径,执行部署
for x in range(len(res)):
    realLocPath = localPath + '\\' + res[x]
    realLocPath = realLocPath.replace("/", "\\")
    print (realLocPath)
    print '=='*60
    if realLocPath.__contains__("\\com\\"):
        cutStr = regPathC(realLocPath)
        cutStr = ''.join(cutStr)
        #匹配本地编译后的文件
        cutStr = cutStr.replace(".java", ".class")
        realLocPath = "E:\\apache-tomcat-6.0.37\\webapps\\archer\\WEB-INF\\classes\\" + cutStr
        cutStrL = cutStr.replace("\\", "/")
        objectPath = "/home/work/tomcat_instances/quanli360.com-instance-3/webapps/archer/WEB-INF/classes/" + cutStrL
        print 'Source:-->',realLocPath
        print 'Server:-->',objectPath
        deployServer(realLocPath,objectPath)
    elif realLocPath.__contains__("\\site\\"):
        print 'start site'
        cutStr = regPathS(realLocPath)
        print cutStr
        cutStr = ''.join(cutStr)
        realLocPath = 'E:\\apache-tomcat-6.0.37\\webapps\\archer\\site' + cutStr
        objectPath = '/home/work/tomcat_instances/quanli360.com-instance-3/webapps/archer/' + cutStr
        cutStrL = cutStr.replace("\\", "/")
        objectPath = '' + cutStrL
        print cutStr,realLocPath, objectPath
        # deployServer(realLocPath,objectPath)
    else:
        print ("no contains")
    # deployLoc(realLocPath)

print '=='*60

 

posted @ 2016-01-06 09:45  嘚不嘚  阅读(1547)  评论(0编辑  收藏  举报