代码推送脚本
代码推送的流程为:
- 前端代码构建
- 压缩构建后的代码
- ssh 连接
- 上传压缩文件到指定目录
- ssh 交互 cd 到指定目录
- ssh 交互 unzip 压缩包,并且删除一些文件
- ssh 退出登录
代码如下:
const chalk = require('chalk');
const ora = require('ora');
let open = require("open");
const spinner = ora({
text: 'connecting sever...',
color: 'cyan'
})
const { exec } = require('child_process');
const compressing = require('compressing');
const Client = require('ssh2').Client;
// SSH 连接配置
const server = {
host: '',
port: 22,
username: '',
password: ''
};
// 代码推送地址配置
const config = {
sourcePath: 'dist',
remotePath: '/data/temp',
};
const connect = new Client();
/**
* @description 连接服务器
*/
function conn(callback) {
connect.on('ready', () => {
spinner.succeed();
callback && callback();
});
connect.on('error', (err) => {
console.error(err);
console.log(chalk.red('connect error.\n'))
});
connect.on('end', () => {
console.log(chalk.cyan('connect end.\n'))
});
connect.on('close', (err) => {
if (err) {
console.log(err)
console.log(chalk.red('connect closed.\n'))
}
})
spinner.start('connect server...');
connect.connect(server);
}
/**
* @description 文件上传
*/
function upload() {
spinner.start("upload file...\n")
connect.sftp((err, sftp) => {
if (err) throw err
sftp.fastPut(
`${config.sourcePath}.zip`,
`${config.remotePath}/${config.sourcePath}.zip`,
(err, res) => {
if (err) {
console.log(err)
spinner.fail('upload failed')
connect.end()
return
}
spinner.succeed()
unzipShell()
})
});
}
/**
* @description 服务器解压命令
*/
function unzipShell() {
spinner.start('unzip...')
connect.shell((err, stream) => {
if (err) throw err
let buf = "";
stream.on('close', err => {
if (err) {
console.error(err)
return
}
spinner.succeed()
connect.end()
open('https://www.baidu.com', 'chrome');
});
stream.on('data', data => {
buf += data
/**
* TODO 这里有一个问题是打印的日志比较乱, 不是顺序打印的
* 需要优化逻辑, 暂时没想到办法, 先注释代码
*/
console.log(data.toString())
});
stream.write(`cd ${config.remotePath} && unzip -o ${config.sourcePath}.zip \n`)
stream.write(`cd ${config.sourcePath} && /bin/cp -r -f * ../ \n`)
stream.write(`cd ../ && rm -rf ${config.sourcePath} \n`)
stream.write(`rm -f ${config.sourcePath}.zip \n`)
stream.write(`exit\n`)
})
}
/**
* @description 文件压缩
*/
function compress() {
spinner.start('compress file...');
compressing
.zip
.compressDir(`${config.sourcePath}`, `${config.sourcePath}.zip`)
.then(() => {
spinner.succeed();
conn(upload);
});
}
/**
* @description 构建镜像
*/
function buildImage() {}
/**
* @description 代码打包
*/
function compile() {
// const bat = exec('npm run build', (err, stdout, stderr) => {
// if (err) {
// console.error(`exec error: ${err}`);
// return;
// }
// console.log(chalk.cyan('build success'))
// compress()
// })
compress()
}
// 流程开始
compile()
其打印日志如下,有一部分的内容显示逻辑没有处理好:
希望的流程是以问答的方式展现,和在终端操作的方式一样,现在的体验太差了,如果你有解决办法,希望你能告诉我,谢谢。