前言
看到公司前端的小伙伴们在开发测试阶段都是自己打包然后丢到测试服务器的指定目录的,所以自己就琢磨着怎么通过脚本来实现自动上传,后期考虑监听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)
网友评论