当前位置: 首页 > news >正文

FTP自动上传/vue打包自动上传

ftp自动上传

在我们平时开发项目时,需要将本地代码编译后上传到服务器,我们可以借助Node.js库中的ssh2来实现自动上传

首先我们先来说下ssh2的安装和使用

  1. 安装ssh2
  npm install ssh2
  1. 创建ssh2实例
  const { Client } = require('ssh2');
  1. 连接服务器
  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()
      })
  })
}


相关文章:

  • Redis(高阶篇)02章——BigKey
  • 【私人笔记】Web前端
  • 计算机网络(涵盖OSI,TCP/IP,交换机,路由器,局域网)
  • python旅游推荐系统+爬虫+可视化(协同过滤算法)
  • ES7 (ES2016) 新特性
  • try learning-git-branching
  • 机器学习_14 随机森林知识点总结
  • 【Python 打造高效文件分类工具】
  • Hbase 2.2.4 伪分布环境与安装
  • Golang GORM系列:GORM分页和排序
  • Docker 安装和配置 Nginx 详细图文教程
  • STM32 低功耗模式
  • 一周学会Flask3 Python Web开发-Debug模式开启
  • TailwindCss的vue3安装使用
  • 深度学习05 ResNet残差网络
  • 备战蓝桥杯 Day4 差分
  • vite+vue3开发uni-app时低版本浏览器不支持es6语法的问题排坑笔记
  • 【论文笔记】Transformer^2: 自适应大型语言模型
  • 【Linux】【网络】Libevent基础
  • React入门 – 1. 学习React的预备知识
  • 1块钱解锁2万部微短剧还能日更,侵权盗版难题怎么破?
  • 61岁云浮市律师协会副会长谭炳光因突发疾病逝世
  • 从近200件文物文献里,回望光华大学建校百年
  • 对谈|“大礼议”:嘉靖皇帝的礼法困境与权力博弈
  • 德州国资欲退出三东筑工,后者大股东系当地房企东海集团
  • 齐白石精品在波士顿展出,“白石画屋”呈现水墨挥洒