使用Python部署Vue打包文件

2021-08-12  本文已影响0人  一个小前端程序员

注:放在项目的根目录下

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import os
import sys
import zipfile
import time
import paramiko

servers = [
    {
        "name": 'xxx',
        "domain": '',
        "host": 'xxx.xxx.xxx.xxx',#服务器地址
        "port": 22,#服务器端口
        "username": 'xxx',#用户名
        "password": 'xxx',#密码
        "path": 'xxxx'#前端代码路径
    }
]

def build_dist():
    os.system("cd "+project_path+"&npm run build")

def zip_files(dirpath,outFullName):
    """
    压缩指定文件夹
    :param dirpath: 目标文件夹路径
    :param outFullName: 压缩文件保存路径+xxxx.zip
    :return: 无
    """
    zip = zipfile.ZipFile(outFullName,"w",zipfile.ZIP_DEFLATED)
    for path,dirnames,filenames in os.walk(dirpath):
        # 去掉目标根路径,只对目标文件夹下边的文件及文件夹进行压缩
        fpath = path.replace(dirpath,'')

        for filename in filenames:
            zip.write(os.path.join(path,filename),os.path.join(fpath,filename))
    zip.close()

# 上传文件
def upload_file(client,server):
    sftp = client.open_sftp()
    sftp.put(local_dist_path+"dist.zip", server["path"]+"/dist.zip",callback=progress_bar)#将本地的Windows.txt文件上传至服务器/root/Windows.txt
    print("文件上传完成")

# 下载文件
def download_file(client,server,file_name):
    sftp = client.open_sftp()
    sftp.get(server["path"]+file_name,local_backup_path+file_name,callback=progress_bar)#将本地的Windows.txt文件上传至服务器/root/Windows.txt
    print("文件下载完成")

#远程登陆操作系统
def ssh_exec_command(client,cmd):
    stdin, stdout, stderr = client.exec_command(cmd)
    #获取命令执行结果,返回的数据是一个list
    result = stdout.readlines()
    print("[%s]执行成功"%(cmd))
    return result

# 文件传输进度条
def progress_bar(transferred, toBeTransferred, suffix=''):
    percents = round(100.0 * transferred / float(toBeTransferred), 1)
    sys.stdout.write('文件传输进度:%s%s %s\r' % (percents, '%', suffix))
    sys.stdout.flush()
    
def main(server):
    print("*******正在操作环境:%s[%s:%s]**********"%(server["name"],server["host"], server["port"]))
    try:
        #创建ssh客户端
        client = paramiko.SSHClient()
        #第一次ssh远程时会提示输入yes或者no
        client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        #密码方式远程连接
        client.connect(server["host"], server["port"], username=server["username"], password=server["password"], timeout=20)

        # 服务器压缩文件名称
        back_up_file_name = server["name"]+ os.getcwd().split("\\")[-1] +time.strftime("%Y%m%d%H%M%S", time.localtime())+".zip"
        try:
            # 服务器文件压缩
            ssh_exec_command(client,"cd %s;zip -r %s *"%(server["path"],back_up_file_name))
            # 下载压缩的文件备份
            download_file(client,server,back_up_file_name)
            # 删除掉文件夹内的文件
            ssh_exec_command(client,"cd %s;rm -rf *"%(server["path"]))
        except IOError:
            print("服务器没有文件")
        # 上传打包文件
        upload_file(client,server)
        # 解压上传打包文件
        ssh_exec_command(client,"cd %s;unzip -o dist.zip -d ./"%(server["path"]))
        # 删除压缩文件
        ssh_exec_command(client,"cd %s;rm -rf ./dist.zip"%(server["path"]))
    except Exception as e:
        print(e)
    finally:
        client.close()

if __name__ == "__main__":
    
    # 本地存储备份包的路径
    local_backup_path = "D:/YinYan/Project/hrmp-backup/"
    # 本地打包文件存储路径
    local_dist_path = "D:/YinYan/Project/hrmp-backup/"
    # 项目路径
    project_path = os.getcwd()

    for idx,server in enumerate(servers):
        print("环境:%s      值:%d"%(server["name"],idx))
    print("所有环境      值:999")
    print("----------选择发包环境-----------")
    
    index = int(input("请输入:"))

    print("----是否要重新打包[0:否][1:是]----")
    flag = int(input("请输入:"))
    
    # 执行打包命令
    if(flag):
        build_dist()
    # 压缩打包文件
    zip_files(project_path+"\dist",local_dist_path+"dist.zip")

    if index != 999:
        server = servers[index]
        main(server)
    else:
        for server in servers:
             main(server)
    
上一篇下一篇

猜你喜欢

热点阅读