美文网首页
使用Python3完成前端包自动部署到测试服务器

使用Python3完成前端包自动部署到测试服务器

作者: ZT_Story | 来源:发表于2021-03-05 16:10 被阅读0次

    前言

    看到公司前端的小伙伴们在开发测试阶段都是自己打包然后丢到测试服务器的指定目录的,所以自己就琢磨着怎么通过脚本来实现自动上传,后期考虑监听svn commit记录并且自动脚本化打包到测试服务器,这样就完成了极简的CI流程了

    流程

    1、对项目进行npm install
    2、对项目进行npm run build
    3、将打包好的dist文件放到服务器的对应目录下

    具体实践

    开始想着使用shell脚本来完成上传的,考虑到上传文件需要使用到scp命令和expect扩展来完成
    对于有homebrew的mac开发者来说安装这些比较方便容易,对于windows的小伙伴来说可能稍微麻烦一些
    所以后面采用Python3来完成脚本内容,其中应用到的库为基础库os,os.path和第三方pexpect

    0、准备工作
    这里用到了python3.8.6 结合 vscode 开发脚本代码
    我是采用mac os系统开发的所以简单介绍下安装的流程
    ①homebrew 的安装
    清华镜像源homebrew安装
    ②通过homebrew安装python3

    brew install python3
    

    ③vscode 安装 Python支持插件


    image.png

    并通过左下角选择Python的解释器版本路径

    image.png
    ④通过 pip3 安装pexpect
    pip3 install pexpect
    

    1、项目打包
    前两步相信做过前端开发的朋友们肯定再熟悉不过,这里就不做过多赘述

    2、上传文件

    #!/usr/bin/python3
    # -*- coding:utf-8 -*-
    import os
    import os.path
    import pexpect
    
    #这里配置服务器参数,如果是分发到多台或者不同项目配置可以单独编写config文件
    ip = "xxx"
    password = "xxx"
    remoteurl = "/opt/xxx"
    localurl = "./dist/"
    
    #这里由于scp命令不支持/*的解析方式,所以需要将dist的子文件或文件夹遍历出来
    finalpath = ""
    for path in os.listdir(localurl):
        finalpath += "%s%s " % (localurl, path)
    print(finalpath)
    
    #与服务器文件传输主要依赖scp命令,具体语法可以查询scp命令
    cmd = 'scp -r %s root@%s:%s' % (finalpath, ip, remoteurl)
    scp = pexpect.spawn(cmd)
    #expect主要的工作是解决连接服务器的时候密码输入问题
    scp.expect("password")
    scp.sendline(password)
    scp.expect("yes/no")
    scp.sendline("yes")
    #执行scp命令
    scp.read()
    

    核心代码就这么多,这些代码足以实现文件上传的功能,但是我们在上传打包项目时候,覆盖原文件前还需要备份上次打包结果,所以可以参考上传文件的脚本做一次下载备份文件的操作

    #主要区别的代码,细心的同学发现就是换了一下 -r 后面的path顺序
    cmd = 'scp -r root@%s:%s %s' % (ip, remoteurl, localurl)
    

    然后用shell脚本驱动.py文件执行就可以了(这里路径记得按自己的实际目录和文件命名调整一下)

    #进入当前目录
    pa=`dirname $0` 
    cd $pa
    #通过绝对路径访问Python文件
    python3 $(pwd)/download-shell/download.py
    python3 $(pwd)/upload-shell/upload.py
    

    PS:
    因为mac OS会在文件夹下生成.DS_Store文件,而我们又不希望这个文件被上传到服务器,则上传前需要清理一下

    def delete_DSStore(dir):
        for path in os.listdir(dir):
            file_path = os.path.join(dir, path)
            if os.path.isdir(file_path):
                delete_DSStore(file_path)
            elif path == '.DS_Store':
                os.remove(file_path)
    
    delete_DSStore(localurl)
    

    参考资料:
    linux自动化交互脚本expect详解
    scp命令详解
    Linux Expect 简介和使用实例

    相关文章

      网友评论

          本文标题:使用Python3完成前端包自动部署到测试服务器

          本文链接:https://www.haomeiwen.com/subject/cqerqltx.html