前端ssh自动部署

2023-10-29

1、先安装两依赖包,archiver 是用来压缩dist文件,node-ssh用来和ssh链接登录以及命令的执行。

npm install node-ssh archiver --save

2、在根目录建一个文件,我这里给它取名upload.js

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: 'x.x.x.x',
  pathUrl: '/x/x/x',  // 远程存放发布文件的地址
};

// =============第一步===========本地文件压缩
const zipDirector = () => {
  const output = fs.createWriteStream(`${__dirname}/../dist.zip`);
  const archive = archiver('zip', {
    zlib: { level: 3 }, // 压缩层级
  }).on('error', (err) => {
    throw err;
  });
  output.on('close', (err) => {
    if (err) {
      console.log('压缩错误:', err);
      return;
    }
    uploadFile();
  });
  output.on('end', () => {
    console.log('output.on:end');
  });
  archive.pipe(output);
  archive.directory(distPath, '/dist');
  archive.finalize();
};

// =============第二步===========将本地压缩包文件上传至远程服务器
function uploadFile() {
  ssh.connect({
    host: config.host, 
    username: 'xxxx',  //用户名
    privateKey: `C:/Users/xxxx/.ssh/id_rsa`, //本地存放私钥的文件地址
    port: 22  //端口号
  }).then(() => {
    // SSH链接成功,将dist压缩包上传至远程服务器的指定地址
    ssh.putFile(`${__dirname}/../dist.zip`, `${config.pathUrl}/dist.zip`).then(() => {
      updateFile();// 上传成功后执行远程服务器上的.sh脚本
    }).catch((err) => {
      console.log('上传失败:', err);
      process.exit(0);
    });
  }).catch((err) => {
    console.log('SSH链接失败:', err);
    process.exit(0);
  });
}

// =============第三步===========执行远程部署命令
const updateFile= () => {
  // ssh.execCommand 在指定文件夹下执行了命令 sh unzip.sh 
  // unzip.sh对上传的压缩包进行解压
  ssh.execCommand('sh unzip.sh', { cwd: config.pathUrl }).then((result) => {
    if (!result.stderr) {
      console.log('success!');
      process.exit(0);
    } else {
      console.log('Something wrong:', result);
      process.exit(0);
    }
  });
};

zipDirector();

3、远程服务器unzip.sh文件将原来的assets文件夹和index.js文件删除。再将dist压缩包解压出来。具体执行代码自行查阅。

4、在package.json文件中添加命令

"scripts": {
    ...
    "build-dev": "vue-cli-service build --mode=dev",
    "deploy-dev": "npm run build-dev && cross-env NODE_ENV=dev node ./upload.js",
  },
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

前端ssh自动部署 的相关文章

  • 前端vue项目部署到tomcat,一刷新报错404解决方法

    原文链接 https my oschina net u 1471354 blog 4277008 VUE项目部署到Tomcat之后 刷新页面会出现404 此问题主要是使用了VUE router的History模式 一 解决方案 1 编辑se
  • Vue (三) 生命周期--钩子函数

    生命周期 Vue官网生命周期的描述 钩子函数 1 beforeCreate 创建Vue实例化之前所调用的函数 div h1 message h1 div
  • java上传图片、文件和富文本内容到服务器上,查看和删除文件

    1 上传富文本内容 前端的富文本内容传到后端 将富文本内容拼接成html页面代码 将内容转换成html文件上传到服务器指定位置进行存储 String profile data xiangmu linux服务器上项目文档存放目录 String
  • vue父子组件通信方式哪几种

    第一种 props和 emit parent vue
  • 微信pc端浏览器打开页面空白的问题

    今天写了一个web项目 用chrome浏览器 手机端微信你打开都没问题 但是在pc端微信打开后是空白的 于是我重新做了一个空白的vue项目 用pc端微信浏览器是可以打开的 慢慢调试发现是语法的问题 一步一步减去组件 再一步一步加上组件 最终
  • Vue3中的pinia使用(收藏版)

    1 pinia介绍 个人网站 紫陌 笔记分享网 想寻找共同学习交流 共同成长的伙伴 请点击 前端学习交流群 pinia 是 Vue 的存储库 它允许您跨组件 页面共享状态 就是和vuex一样的实现数据共享 依据Pinia官方文档 Pinia
  • vue实现拍照人脸识别功能带人脸选中框

    前言 实现打开摄像头 并识别人脸 实现效果 实现步骤 一 安装 1 官网下载 tracking js 的代码包官网入口 2 npm下载 执行命令 cnpm install tracking save 二 demo案例代码
  • Vue与TypeScript的完美结合

    前言 TypeScript 是 JS类型的超集 并支持了泛型 类型 命名空间 枚举等特性 弥补了 JS 在大型应用开发中的不足 在我们自己单独学习 TS时 时常感觉很多知识点还是比较好理解的 但要和框架结合的话 感觉就有点糟 因为我使用Vu
  • vue 子父组件间的那些事儿——搭建项目(一)

    一 搭建vue项目 1 环境准备 基于nodejs vue cli cnpm 搭建vue项目 由于本博主已经具备以上环境 现在直接进行项目搭建 环境准备可参考这篇博客 https blog csdn net xcymorningsun ar
  • vue动态绑定video视频src问题解决

    做个项目 视频部分需要先后台上传 然后前端页面显示 然后就遇到了视频动态获取地址的问题 一开始想着很简单 使用v model双向绑定就行了 结果试了下并不行 后面开始度娘 尝试过很多人说的 refs解决 结果并不行 虽然浏览器中看地址确实绑
  • vue项目使用视频播放器vue-video-player

    安装使用 插件有版本限制 如果项目使用的是vue2 0版本 请选择安装 4 x版本 否则会安装不成功 yarn add vue video palyer save 或者 npm install vue video palyer save 组
  • H5查看pdf文件(pdfh5)

    我用的是 pdfh5 来查看的H5中的pdf文件 使用 pdfh5 插件来打开 pdf文件 下面是两种使用方法 方法一 二都可以 但是我在使用方法二时有卡顿现象 可能是因为未开启懒加载 方法二中的 on 可以打印出来错误信息 使用方法 1
  • 前端将List列表转化为树型结构(reduce函数)

    主要用到了reduce 函数 for循环可以做到的事情reduce 都可以做到 甚至操作起来更加简单方便和高雅 reduce 为数组中的每一个元素依次执行回调函数 不包括数组中被删除或从未被赋值的元素 reduce语法 array redu
  • vue_域名部署无法访问后端

    前言 目前部署的比较另类 因为服务器为 windows 目前还不是很会 nginx 所以现在就只能在服务器上安装 nodejs 然后直接使用 npm run dev 命令行的方式运行项目 遇到的坑 使用ip访问前端的时候 就可以访问 但是通
  • Vue学习之watch侦听器:案例实现翻译功能

    watch侦听器 作用 监视数据的变化 当数据发生变化时 执行一些业务逻辑或者是异步操作 执行的场景例如在线翻译 当文本区域的内容发生变化时 会发生翻译内容的同时更新 语法 简单的写法 简单数据类型 可以直接的进行监听 完整的写法 添加额外
  • 基于vue2+海康威视web开发包3.2 无插件版本开发的监控系统

    文章目录 前言 一 插件准备 二 使用步骤 前言 项目最终效果为 可以预览 并且可以使用云台控制 购买的海康威视摄像头必须可以开启websocket 一 插件准备 插件下载地址 下载WEB无插件开发包V3 2 并加入到vue项目中 下载后解
  • 拓展:vue 父组件调用子组件方法ref(且父组件可通过ref调用的方法传值给子组件)

    1 ref被用来给元素或子组件注册引用信息 引用信息将会注册在父组件的 refs对象上 一 ref被用来给元素或子组件注册引用信息 引用信息将会注册在父组件的 refs对象上 div class formBtn fl 111 div div
  • (vue)el-popover鼠标移入提示效果

    vue el popover鼠标移入提示效果 效果 代码
  • vue中的防抖和节流

    在Vue中 防抖和节流是两种常用的优化技术 用于限制事件的触发频率 以提高页面性能 防抖 Debounce 是指在事件被触发后 等待一段时间后再执行回调函数 如果在这段等待时间内 事件又被触发 则重新计时 防抖通常用于限制重复触发频率较高的
  • 黑豹程序员-字符串中查找出重复的字符串

    Collections frequency codeList element 字符串element 在codeList集合中重复的次数 List

随机推荐

  • unity游戏关卡解锁和未解锁时的不同图片以及可或不可按下

    若想让按钮不可按只要将interactable的勾勾关掉就可以了 一般用做未解锁的关卡 public void UpdateOnce 用于更新过关数 没解锁的抑制 for int i 0 i
  • 分享web前端七款HTML5 Loading动画特效集锦

    以前我们大部分的Loading动画都是利用gif图片实现的 这种图片实现Loading动画的方法虽然也很不错 但是作为HTML5开发者来说 如果能利用HTML5和CSS3实现这些超酷的Loading动画 那将是一件非常痛快的事情 1 HTM
  • 生产环境elasticsearch的配置建议

    以下主要来自官方文档 主要分为几块 硬件方面 内存 CPU 硬盘 网络 其他 操作系统 较大的文件描述符 设置MMap 管理工具 JVM虚拟机 请不要调整JVM设置 请不要修改垃圾收集器 给lucene留下一半的内存空间 不要超过32G 避
  • CentOS7安装Oracle数据库的全流程

    一 准备工作 1 下载Oracle的安装介质 Oracle 11g R2 Linux版本有两个压缩文件包 都需下载安装才会完整 linux x64 11gR2 database 1of2 zip linux x64 11gR2 databa
  • ip 和 iphdr

    1 struct ip 和struct iphdr struct ip if BYTE ORDER LITTLE ENDIAN u char ip hl 4 header length ip v 4 version endif if BYT
  • 数组也是对象

    一个对象中的属性名不仅仅是字符串格式 还有可能是数字格式的 当我们存储的属性名不是字符串也不是数字的时候 浏览器会把这个值转换为字符串 toString 然后在进行存储 obj 300 gt 先把 toString 后的结果作为对象的属性名
  • 处理递归数据的键名

    tortoise data 使用递归函数 if data data length lt 0 递归的出口 return null return data map e gt 循环数据 const model name e label id e
  • 剑指offer 学习笔记 圆圈中最后剩下的数字

    面试题62 圆圈中最后剩下的数字 0 1 n 1这n个数字排成一个圆圈 从数字0开始 每次从这个圆圈里删除第m个数字 求出这个圆圈里剩下的最后一个数字 本题就是约瑟夫环问题 法一 用环形链表模拟圆圈 我们可以直接用标准库的list模拟环形链
  • [转]怎样在systemverilog DPI中调用SV,C与C++(二)

    有的时候需要交互struct union数据类型 下面举个简单例子 在SV里定义这个一个结构体 typedef struct int id string name xaction 同样的 在C里定义同样的结构体 结构体名可以不一致 type
  • Android 数据库框架GreenDao

    参考详情网站 Android 数据库框架 GreenDao org greenrobot greendao 起航 当风起时的博客 CSDN博客
  • java的string常用方法_java中String类的常用方法

    public class HelloWorld public static void main String args Java文件名 String fileName HelloWorld java 邮箱 String email laur
  • Pandas分组、聚合、过滤操作全面解析!

    gt gt gt import numpy as np gt gt gt import pandas as pd gt gt gt df pd read csv data table csv index col ID gt gt gt df
  • Redisson-分布式锁-闭锁

    Redisson 分布式锁 闭锁 引入必要依赖
  • 以色列技术!Amimon无线WHDI技术解析

    转自 http www pcpop com doc 0 579 579310 all shtml Amimon WHDI技术独家解析 泡泡网高清频道9月23日 今年年初 本站独家撰写有关无线技术的展望性文章 Intel Android 天幕
  • 慢~再听我讲一遍Activity的启动流程

    前言 activity启动的流程分为两部分 一是在activity中通过startActivity Intent intent 方法启动一个Activity 二是我们在桌面通过点击应用图标启动一个App然后显示Activity 第二种方式相
  • 5个可以激发设计灵感的AI工具推荐

    当设计灵感耗尽 陷入创作瓶颈时 人工智能艺术生成器可能会为您提供新的启示 这些基于深度学习和发展 神经网络 的工具可以将输入的文本描述或图像转换成各种风格的艺术作品 并提供丰富的风格参数和材料库 让您可以自由调整和创作 无论是专业设计师还是
  • R语言中读取和处理文件的常用方法

    测试文件放在rawdata 目录下 包含以下内容 我在rawdata下存放了以上文件 目录 1 dir 2 list files 3 dir ls 4 整理文件下的内容 重要 获得包含特定字符串的文件 获得文件绝对路径 将文件粘贴至另一个文
  • JAVA根据模板生成WORD文件并导出

    JAVA根据模板生成WORD并导出 实现功能 一 WORD导出效果 二 编写WORD模板 三 引入所需maven依赖 四 JAVA代码工具类 五 配置信息说明 六 在固定位置插入表格 6 1 情况说明 6 2 编码实现 6 3 导出效果 七
  • javaWeb学习笔记 --- Html

    HTML html是超文本标记语言 它规定了自己的语法规则 用来表示比 文本 更丰富的意义 比如图片 表格 链接等 目前互联网上的绝大部分网页都是使用HTML编写的 html的结构
  • 前端ssh自动部署

    1 先安装两依赖包 archiver 是用来压缩dist文件 node ssh用来和ssh链接登录以及命令的执行 npm install node ssh archiver save 2 在根目录建一个文件 我这里给它取名upload js