一般来说软件开发流程规范的公司会有标准 CI/CD 流程,本文不谈 Jenkins 或是git hook 等工具,介绍两种在小项目中最快也最原始的方式一键打包上线的方式。
- webpack-sftp-client
- shell expect
webpack-sftp-client,使用步骤如下:
- 安装
1
| npm install webpack-sftp-client -D
|
- 在 webpack.dev.js webpack.prod.js 中引入并配置
1 2 3 4 5 6 7 8 9 10 11 12
| const WebpackSftpClient = require('webpack-sftp-client');
new WebpackSftpClient({ port: '22', host: '', username: 'root', password: '', path: './test/', remotePath: '', verbose: true }),
|
然后 使用 npm run prod 或者 npm run dev 打包后就会自动上线了。
shell 的方式 就是通过编写 shell 脚本的形式,如下:
1 2 3 4 5 6 7 8 9 10 11
| #!/bin/bash
serverIp=""
dstDir=""
npm run prod
zip -r dist.zip dist scp dist.zip root@${serverIp}:${dstDir} ssh root@${serverIp} "cd ${dstDir}; unzip -o dist.zip"
|
这种方式 需要提前使用 ssh-copy-id 打通 ssh 免密登陆,如果开发机是临时申请或 ip 变动频繁,那么每次都要配置免密登陆无疑是非常麻烦的事情,作为开发者如果是重复的事情肯定要自动化。
一般来说 临时申请的机器 密码不会频繁变更,因此可以通过输入密码的方式,但是 ssh 密码又是交互式的,这里再介绍两种工具来处理 ssh 密码输入
1 2 3 4 5
| sshpass -p'passwd' ssh root@serverIp
sshpass -f ~/.ssh/passwd_file ssh root@serverIp
|
expect 可以用来处理交互式的输入,它可以通过匹配正则的方式来发送对应规则的输入,例子如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| /usr/bin/expect <<-EOF set timeout 30 spawn scp dist.zip root@${serverIp}:${dstDir} expect "*password:" send "${passwd}\n" expect eof set timeout 300 spawn ssh root@${serverIp} "cd ${dstDir}; unzip -o dist.zip" expect "*password:" send "${passwd}\n" expect eof
EOF
|
综合上面我们就可以完善一个发布上线的脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| #!/bin/bash
passwd=""
serverIp=""
dstDir=""
npm run prod
if [ $? != 0 ];then echo "打包失败" exit 1 fi zip -r dist.zip dist
/usr/bin/expect <<-EOF set timeout 30 spawn scp dist.zip root@${serverIp}:${dstDir} expect "*password:" send "${passwd}\n" expect eof
set timeout 300 spawn ssh root@${serverIp} "cd ${dstDir}; unzip -o dist.zip" expect "*password:" send "${passwd}\n" expect eof
EOF
|