微前端大行其道,前端部署变的独立又简单。然,当环境错综混乱,尤其是前端开发水平参差不齐时,部署也成了一个头疼问题。
让部署简单方便,说就干,我找到了你心仪的node-ssh
首先,我们再package.json文件的scripts下添加一句启动命令,之后我们通过执行`npm run deploy`即可完成部署
{
"scripts": {
"dev": "****",
"build": "****",
"deploy": "node ./deploy/shell.js"
}
}
我们需要加载两个依赖包:node-ssh和archiver
`npm install node-ssh archiver --save`
node-ssh执行SSH远程登录、远程命令执行,archiver负责文件压缩打包。deploy帮我们做的事情:
① 压缩本地dist文件
② 远程ssh登录(建议免密登录)
③ 本地dist.zip压缩包拷贝至远程服务器指定目录下
④ 执行远程部署脚本(这里建议写一个sh部署脚本)
下面开始我们的脚本开发,请注意脚本方法的执行顺序是从下向上的。
const fs = require('fs');
const path = require('path');
const archiver = require('archiver');
const { NodeSSH } = require('node-ssh');
// 正确设置本地dist文件路径
const distPath = path.resolve(__dirname, '../dist');
const ssh = new NodeSSH();
// 获取远程服务器配置信息 此处建议通过配置文件获取
const config = {
host: '1.1.1.1',
pathUrl: '/****/****', // 远程存放文件地址
};
// =============第三步===========执行远程部署命令
const remoteServiceUpdate = () => {
// ssh.execCommand 在指定文件夹下执行了命令 sh upgrade.sh
// 此处请根据个人情况处理,此处只是给各位看官打个样~
ssh.execCommand('sh upgrade.sh', { cwd: config.pathUrl }).then((result) => {
console.log(`The update message is: ${result.stdout}`);
if (!result.stderr) {
console.log('Gratefule! update success!');
process.exit(0);
} else {
console.log('Something wrong:', result);
process.exit(0);
}
});
};
// =============第二步===========本地文件上传至远程服务器
function uploadFile() {
ssh.connect({
host: config.host,
username: 'root',
privateKey: `${process.env.HOME}/.ssh/id_rsa`,
}).then(() => {
console.log('SSH login success');
// 上传网站的发布包至configs中配置的远程服务器的指定地址
ssh.putFile(`${__dirname}/../dist.zip`, `${config.pathUrl}/dist.zip`).then(() => {
console.log('The zip file is upload successful');
remoteServiceUpdate();// 上传成功后触发远端脚本
}).catch((err) => {
console.log('the file upload fail:', err);
process.exit(0);
});
}).catch((err) => {
console.log('SSH conneting fail:', err);
process.exit(0);
});
}
// =============第一步===========本地文件压缩
const zipDirector = () => {
const output = fs.createWriteStream(`${__dirname}/../dist.zip`);
const archive = archiver('zip', {
zlib: { level: 3 }, // 压缩层级 目前我们只有2层
}).on('error', (err) => {
throw err;
});
output.on('close', (err) => {
if (err) {
console.log('something error width the zip process:', err);
return;
}
uploadFile();
console.log(`${archive.pointer()} total bytes`);
console.log('archiver has been finalized and the output file descriptor has closed.');
});
output.on('end', () => {
console.log('Data has been drained');
});
archive.pipe(output);
archive.directory(distPath, '/dist');
archive.finalize();
};
// 启动 走你
zipDirector();
脚本虽小,效果还是很棒的
① 不用操心再有前端在服务器上误操作
② 前端部署问题控制在了1min之内
③ 最主要的是解决了N个环境部署问题
④ 不要问,问就是像炫技
解放脑子,从我做起,吼吼~