部署node_node-ssh编写前端自动部署脚本

本文介绍了如何使用node-ssh和archiver简化前端部署过程。通过在package.json中添加部署命令,结合这两个依赖进行文件压缩、远程SSH登录及执行部署脚本,实现了自动化部署,避免了误操作,提高了部署效率,并解决了多环境部署问题。
摘要由CSDN通过智能技术生成

79b4704a188d24d0f1ef1ab60b8e2c65.png

微前端大行其道,前端部署变的独立又简单。然,当环境错综混乱,尤其是前端开发水平参差不齐时,部署也成了一个头疼问题。

让部署简单方便,说就干,我找到了你心仪的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个环境部署问题

④ 不要问,问就是像炫技

解放脑子,从我做起,吼吼~

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值