FTP自动上传/vue打包自动上传
ftp自动上传
在我们平时开发项目时,需要将本地代码编译后上传到服务器,我们可以借助Node.js库中的ssh2来实现自动上传
首先我们先来说下ssh2的安装和使用
- 安装ssh2
npm install ssh2
- 创建ssh2实例
const { Client } = require('ssh2');
- 连接服务器
const conn = new Client();
conn
.on('ready', () => {
console.log('SSH Connection Ready');
// 可以在这里执行命令、上传文件等
})
.on('error', (err) => {
console.error('Connection Error:', err);
})
.on('close', () => {
console.log('Connection Closed');
})
.connect({
host: 'your-server-ip',
port: 22, // SSH 默认端口
username: 'your-username',
password: 'your-password', // 或使用 privateKey
});
4.通过 SFTP 上传文件到远程服务器。
首先,你需要确定你的本地编译后的文件路径和目标服务器的文件路径。然后,你可以使用 SFTP(SSH File Transfer Protocol)协议来上传文件。以下是一个简单的示例:
conn.sftp((err, sftp) => {
if (err) throw err;
const localFile = './local-file.txt'; // 本地文件地址,相对地址基于当前脚本
const remoteFile = '/path/to/remote-file.txt';
sftp.fastPut(localFile, remoteFile, {}, (err) => {
if (err) {
console.error('上传失败:', err);
} else {
console.log('文件上传成功');
}
conn.end();
});
});
完整代码如下
const ssh2 = require('ssh2')
let conn = new ssh2.Client();
connect()
// 上传操作
function connect () {
conn.on('ready', () => {
conn.sftp((err, sftp) => {
sftp.fastPut('./dist.tar.gz', '/opt/web/dist.tar.gz', {}, (err, result) => {
//上传完成后开始解压
Shell(conn)
})
})
}).connect({
host: '10.10.10.10',
port: '22',
username: 'root',
password: 'root'
})
}
// 解压部署操作
function Shell (conn) {
conn.shell((err, stream) => {
stream.end(
`
cd /opt/web
tar zxvf ./dist.tar.gz
rm -rf dist.tar.gz
exit
`
//进入服务器暂存地址
//解压上传的压缩包
//删除压缩包
//退出
).on('data', data => {
console.log(data.toString())
}).on('close', () => {
conn.end()
})
})
}
有时我们想将打包build这一步操作也放入进入,或者使用的是lerna多包一起打包时,先打包完成再一起上传,这里我们需要用到node插件child_process
child_process 是 Node.js 中的一个核心模块,用于创建和管理子进程。它允许你从 Node.js 程序中启动和控制其他进程(例如 shell 脚本、命令行工具或其他 Node.js 脚本),使得 Node.js 可以与外部程序交互,进行并行处理。
假如我们现在有一个文件./build-test.sh是处理vue或者其他项目打包的脚本,我们可以使用child_process来执行这个脚本,如下:
# build各个微应用
lerna run --scope '{test1,test2,test3}' build:test
# 移动各个包至根目录
mv ./test1/test1 ./
mv ./test2/test2 ./
mv ./test3/test3 ./
# 将各个应用打包输出
tar -czvf dist.tar.gz ./test1 ./test2 ./test3
rm -rf ./test1 ./test2 ./test3
先将多个包打包后再进行gz压缩,最后输入一个压缩包
对应调用./build-test.sh的脚本如下
//执行tar.sh脚本获取输出流
let pro = cp.exec('"./build-test.sh"', (error) => {
if (error) {
console.log(error)
}
})
pro.stdout.pipe(process.stdout)
pro.on('exit', () => {
//打包完成后上传
// dosome thing
})
到这里了我们就可以直接调用我们之前写好的connect方法,来进行FTP上传
const cp = require('child_process')
//此包ssh2需要下载
const ssh2 = require('ssh2')
//执行tar.sh脚本获取输出流
let pro = cp.exec('"./build-test.sh"', (error) => {
if (error) {
console.log(error)
}
})
pro.stdout.pipe(process.stdout)
pro.on('exit', () => {
//打包完成后上传
// 上传
connect()
})
let conn = new ssh2.Client();
// 上传操作
function connect () {
conn.on('ready', () => {
conn.sftp((err, sftp) => {
sftp.fastPut('./dist.tar.gz', '/opt/web/dist.tar.gz', {}, (err, result) => {
//上传完成后开始解压
Shell(conn)
})
})
}).connect({
host: '10.10.10.10',
port: '22',
username: 'root',
password: 'root'
})
}
// 解压部署操作
function Shell (conn) {
conn.shell((err, stream) => {
stream.end(
`
cd /opt/web
tar zxvf ./dist.tar.gz
rm -rf dist.tar.gz
exit
`
//进入服务器暂存地址
//解压上传的压缩包
//删除压缩包
//退出
).on('data', data => {
console.log(data.toString())
}).on('close', () => {
conn.end()
})
})
}