基于node一键发布到服务器的js脚本

基于node一键将打包后的前端文件发布到服务器指定目录的js脚本

需要使用node的2个包

javascript 复制代码
npm install ssh2 scp2

基于node进行ssh连接的控件

下面直接贴代码,已经在代码中加了注释

javascript 复制代码
const { exec } = require('child_process');
const { Client } = require('ssh2');
const scpClient = require('scp2');
const path = require('path');

const conn = new Client();

const serverConfig = {
  host: '192.168.3.68',
  port: 22,
  username: 'root',
  password: 'Fdkj@111' // 或者使用 privateKey: require('fs').readFileSync('/path/to/your/private/key')
};

const localDistPath =  path.resolve(__dirname, 'dist'); // 本地dist文件夹路径
const remotePath = '/home/dockerdata/nginx/www/ytkzweb'; // 远程服务器的目标文件夹路径

// 打包命令
const buildCommand = 'npm run build'; 

console.log('开始打包...');

exec(buildCommand, (err, stdout, stderr) => {
  if (err) {
    console.error(`Build failed: ${err.message}`);
    console.error(stderr);
    return;
  }
  conn.on('ready', () => {
    console.log('服务器连接成功!');
    // 清空目标文件夹
    conn.exec(`rm -rf ${remotePath}/*`, (err, stream) => {
      if (err) {
        console.error('Error executing command:', err);
        throw err;
      }

      stream.on('close', (code, signal) => {
        
        if (code !== 0) {
          console.error(`Failed to clear remote directory. Code: ${code}, Signal: ${signal}`);
          conn.end();
          return;
        }
        console.log('清除远程目录成功!');
        console.log('开始传输文件...');
        // 传输文件
        scpClient.scp(localDistPath, {
          host: serverConfig.host,
          username: serverConfig.username,
          password: serverConfig.password,
          path: remotePath
        }, (err) => {
          if (err) {
            console.error('Error:', err);
          } else {
            console.log('文件传输成功!');
          }
          conn.end();
        });
      }).stderr.on('data', (data) => {
        console.error('STDERR:', data.toString());
      });

      // 必须要加,否则stream流的close方法不走
      stream.on('data', (data) => {
        console.log('STDOUT:', data.toString());
      });
      
    });
  }).on('error', (err) => {
    console.error('SSH Connection Error:', err);
  }).connect(serverConfig);
});

注意 注意 注意

javascript 复制代码
stream.on('data', (data) => {
 console.log('STDOUT:', data.toString());
});

这块代码,一定要加

以上

相关推荐
Decay__1 小时前
VMware 安装 SQL Server 双节点 AlwaysOn 可用性组教程 —— WSFC、AG 与侦听器完整部署(系列核心篇)
运维·数据库·sql·mysql·架构
测试界的小码农1 小时前
【Linux 命令实战(06):Linux 文件权限管理,掌握 chmod、chown、chgrp】
linux·运维·服务器
艺杯羹2 小时前
1Panel 装好后 ufw 仍是 inactive:一次服务器安全盲区复盘
服务器·数据库·安全·网络安全·系统架构·实战·1panel
johnjincaaaa2 小时前
猿人学第 18 题「jsvmp 洞察先机」逆向通关实录
javascript·后端
陈希1232 小时前
负载均衡与高可用:LVS、HAProxy、Keepalived 实战
运维·负载均衡·lvs
女神下凡4 小时前
芯参谋(107):杰理AC_中科蓝讯_开发指南
linux·服务器·网络·单片机·嵌入式硬件
落羽的落羽4 小时前
【C++】C++17的主要特性
linux·服务器·开发语言·c++·算法·机器学习
FungLeo5 小时前
成为全栈·Vue 管理后台篇·分类树与标签管理:层级数据如何落到管理界面
前端·javascript·vue.js·分类树·naive ui·标签管理·前端数据结构
总要学点什么5 小时前
第108篇:三维特效-图片轨迹线效果——把贴图滚成一串箭头,想用它的本色反而整条消失
开发语言·javascript·ecmascript·gis·webgl·材质·cesium
SQL776 小时前
IT运维发展史,一部宏伟史诗
运维·运维发展史