作为一个前端开发人员如果你只会写一些业务代码,从程序员的角度来考虑已经可以了。但是从架构的角度来考虑那远远不够;

在此记录下成长中的经历:

想要达成的目的:运行一个脚本实现代码的打包,上传至服务器并部署到服务器中;

服务端:需要安装pm2、nodejs;

在本地根目录下创建一个脚本文件名称自编自便;

1.下载需要依赖的包
npm i compressing ssh2 -S
//compressing 的作用是用来压缩文件的
//ssh2 的作用是用来连接服务器并执行操作的
2.创建操作的文件在根目录
2.1导入node的核心模块child_process
const {exec} = require('child_process')
2.2导入 compressing 压缩文件插件
const compressing = require('compressing')
2.3导入连接远程服务器的插件 ssh2
const Client = require('ssh2').Client;
2.4创建一个对象里面是服务器连接的属性
const server = {
host : '远程服务器的ip地址',
prot : 22, //默认的不用该如果没有修改过的话
username : '登陆远程服务器的用户名',
password : '登陆的用户名密码'
}
2.5创建一个ssh2的对象
const connect = new Client()
2.6在执行整个文件的时候让node创建一个子线程
/*第一个参数是要运行的命令,第二个参数是可选的如果有兴趣可以查看node官网的child_process.exec了解,第三个参数是是回调方法
在回调方法中有三个形参 error stdout stderr
如果成功 error 将会是null else error将会是Error实例
stdout和stderr参数将会包含子进程stdout和stderr输出
*/
const bat = exec('npm run build',(err,stdout,stderr)=>{
if (err) return console.log(`exec error: ${err}`);
console.log("打包成功");
//启动压缩方法
compress();
})
2.7在执行完打包子线程后就对打包好的文件进行压缩
function compress () {
console.log('*******压缩中*******');
//使用导入的compressing插件压缩我们需要的文件
//第一个参数是要压缩的文件夹,第二个参数是压缩过后的压缩包名称
compressing.zip.compressDir('dist/','dist.zip').then(()=>{
console.log('*****压缩成功*****');
// 成功之后就调用连接服务器的方法
conn();
})
}
2.8创建一个连接服务器的方法等压缩成功之后就调用
function conn () {
console.log('*****连接服务器******');
//使用前面定义好的ssh2对象
//ready 表示身份验证成功
//error 表示发生错误
//end 表示断开连接
//close 表示连接以关闭,如果这离是由于错误,hadError则设置为true
connect.on('ready',()=>{
  //在验证成功之后对文件进行上传操作
  upload()
 }).on('error',(err)=>{
  console.error(err)
  console.log('*****连接出错*****')
 }).on('end',()=>{
  console.log('*****连接关闭*****')
 }).on('close',(err)=>{
 if (err) return console.log('*****连接出错*****')
 }).connect(server)
//connect方法使用server里面的参数连接到服务器参数详情可查看ssh2-npm官网
}
2.9当ssh2验证完成之后就调用上传文件的方法
function upload () {
console.log('******开始上传******');
//开启一个sftp会话参数是个回调方法 回调方法有两个参数一个err实例,一个sftp实例
connect.sftp((err,sftp)=>{
if (err) throw err;
  //sftp的上传操作第一个参数是本地需要上传的文件路径,第二个参数是要将本地的文件上传到服务器的那个目录下
  sftp.fastPut('压缩好的文件名称','上传到服务器的目录',(err,res)=>{
  if (err) {
console.log('****上传失败*****');
console.error(err);
//如果发生错误就调用end方法断开连接
connect.end();
return;
  }
  //如果上传成功就调用解压文件的方法
   unzipShell()
})
})
}
2.10当文件上传成功之后就调用解压方法
function unzipShell() {
//在服务器上启动一个交互shell会话第一个参数是可选的,第二个参数是回调方法第一个是error实例第二个是shell会话流
connect.shell((err,stream)=>{
console.log('******解压中******');
if (err) throw err;
  let buf = "";
  //当会话检测到输出的时候嗲用close方法
  stream.on('close',err =>{
  //关闭连接
  connect.end();
  //如果失败就打印失败如果成功就答应成功
  if (err) return console.error(err);
  console.info('****** SUCCESS!! *******');
  }).on('data',data=>{
  //data是从stream.data事件接受的字符串块
  buf += data;
  console.log(buf)
  })
   //当解压完成后在终端中输入命令
   //(以下命令只是示范具体操作看你的项目)
   //1.到上传的目录下取并且解压上传的文件
   //2.cd 到解压后的文件夹里面 将文件夹里面的所有东西复制到上一层
  //3.到上一层目录中删除掉压缩文件和解压过后的文件夹
  //4.cd 到最上层 并且使用pm2托管node服务
  stream.write('cd 上传的文件夹路径 && unzip 压缩的文件名称 \nnext\n');
   stream.write('cd 解压后的文件夹下面 && /bin/cp -r -f * ../ \nnext\n');
  stream.write('cd ../ && rm -r -f dist && rm -r -f 压缩的文件名称 \nnext\n');
   stream.write('cd ../ && pm2 start nodemon server.js \nexit\n'); //server.js就是你需要启动的文件
})
}
3.在服务端的项目根目录中增加server.js文件我使用的是node服务托管文件
//导入node模块express
const express = require("express");
//创建一个服务
const app = express();
//将静态文件托管到本地服务中 文件名称不一定是dist
app.use(express.static("./dist"));
//启动一个服务在3000端口中
app.listen(3000,(err)=>{
if (err) return err;
console.log('server running at http://127.0.0.1:3000');
})

完成的代码

server.js是单独的需要手动创建和下面代码不关联

const {
exec
} = require("child_process");
const compressing = require("compressing");
const Client = require("ssh2").Client;
const server = {
host: '服务器ip',
port: 22,
username: '用户名',
password: '密码'
} const connect = new Client(); function conn() {
console.log('*******连接服务器***********');
connect.on('ready', () => {
upload();
}).on('error', (err) => {
console.error(err);
console.log('*****连接出错******')
}).on('end', () => {
console.log('*******连接关闭********')
}).on('close', (err) => {
if (err) throw err;
}).connect(server);
} function upload() {
console.log('******开始上传********');
connect.sftp((err, sftp) => {
if (err) throw err;
sftp.fastPut('./dist.zip', '/home/yunwo/dist/dist.zip', (err, res) => {
if (err) {
console.error(err);
console.log("*******上传失败******");
connect.end();
return;
}
unzipShell()
})
})
} function unzipShell() {
connect.shell((err, stream) => {
console.log('*******解压中*******');
if (err) throw err;
let buf = "";
stream.on('close', err => {
connect.end();
if (err) return console.error(err);
console.info('******** success!! *********');
}).on('data', data => {
buf += data;
console.log(buf);
})
stream.write('cd /home/yunwo/dist && unzip dist.zip \nnext\n');
stream.write('cd dist && /bin/cp -r -f * ../ \nnext\n');
stream.write('cd .. && rm -r -f dist && rm -r -f dist.zip \nnext\n');
stream.write('cd .. && pm2 start nodemon yunwoserver.js \nexit\n');
}) } function compress() {
console.log('******压缩中********');
compressing.zip.compressDir('dist/', 'dist.zip').then(() => {
console.log('******压缩成功******');
conn();
})
} console.log('*******打包中*******'); const bat = exec('npm run build', (err, stdout, stderr) => {
if (err) return console.error(`exec error : ${err}`);
console.log('********打包成功**********');
compress();
})

node一键发布,并运行的更多相关文章

  1. 一键发布ASP.NET Web安装程序

    转载自:http://www.cnblogs.com/nangong/p/Web.html        前言:最近公司有个Web要发布,但是以前都是由实施到甲方去发布,配置,这几天有点闲,同事让我搞 ...

  2. [原创*精华]一键发布ASP.NET Web安装程序,搞WebForm的童鞋看过来...

          重要更新:鉴于很多小伙伴们说看不到图,我这边换了几个浏览器看了下,都看得到的,估计是网速问题,请耐心等待,另外,为了更好的方便大家学习,特此提供源码以及一个word文档,word文档就是本 ...

  3. 一键发布部署vs插件[AntDeploy]开源了

    deploy to remote server by one button click 功能 支持docker一键部署(支持netcore) 支持iis一键部署(支持netcore和framework ...

  4. netcore开发windows普通服务(非Web)并一键发布到服务器

    如何开发并一键发布WindowsService项目(netcore普通项目) netcore下开发windows服务如果是web项目的话,由于aspnetcore本身是支持的,把默认的host.Run ...

  5. 使用expect脚本语言写一键发布服务(代码发布、所有服务重启)

    互联网服务有很多台服务,但是在上线的时候需要将这些服务版本都更新与个个都重启,下面的脚本语言,就是一键发布服务~ 1.在/home/weihu/deploy/ 目录下建下publish .publis ...

  6. 一键发布部署vs插件[AntDeploy],让net开发者更幸福

    一键发布工具(ant deploy tool) 插件下载地址: https://marketplace.visualstudio.com/items?itemName=nainaigu.AntDepl ...

  7. NodeJs>------->>第二章:Node.js中交互式运行环境--------REL

    第二章:Node.js中交互式运行环境--------REL 一:REPL运行环境概述 C:\Users\junliu>node > foo = 'bar' ; 'bar' > 二: ...

  8. Node.js发布http服务

    Node.js发布http服务 2018-11-09 09:43:03   Visit  0 简单服务 var http = require(\'http\'); http.createServer( ...

  9. VS让人纠结的Release和网站一键发布

    这篇文章不是讲什么知识点,而是开发过程中遇到的问题,一:希望博友看到后知道的给解释一下:二:自己记录一下,下次有时间好好研究一下. 说实话这个问题已经反反复复好几次了,每次都解决不了,都是已另一种方式 ...

随机推荐

  1. 从零开始基于go-thrift创建一个RPC服务

    Thrift 是一种被广泛使用的 rpc 框架,可以比较灵活的定义数据结构和函数输入输出参数,并且可以跨语言调用.为了保证服务接口的统一性和可维护性,我们需要在最开始就制定一系列规范并严格遵守,降低后 ...

  2. WebLogic 任意文件上传远程代码执行_CVE-2018-2894漏洞复现

    WebLogic 任意文件上传远程代码执行_CVE-2018-2894漏洞复现 一.漏洞描述 Weblogic管理端未授权的两个页面存在任意上传getshell漏洞,可直接获取权限.Oracle 7月 ...

  3. python接口自动化(二十九)--html测试报告通过邮件发出去——上(详解)

    简介 前边几篇,已经教小伙伴们掌握了如何生成HTML的测试报告,那么生成测试报告,我们也不能放在那里不管了,这样即使你报告在漂亮,领导也看不到.因此如果想向领导汇报工作,不仅需要提供更直观的测试报告. ...

  4. 【题解】射击-C++

    Description 不难发现,豆豆能从很多事情中去思考数学,于是豆豆父母决定让他去练习射击,这是项需要集中注意力的运动,相信 能够让豆豆暂时脱离数学.学习射击的第一天就让豆豆产生 了浓厚的兴趣,射 ...

  5. [记录]python使用serial模块实现实时WebConsole

    ###tornado+websocket+多进程实现: 1.index.html <!DOCTYPE HTML> <html> <head> <style&g ...

  6. 整型,布尔值,字符串详解,for语句

    整型 -- 数字 用于比较和计算 + - * / // python 2 int --- long (长整型) /获取的是整数 Python3 int---整型 / 获取的浮点数 二进制 --- 就是 ...

  7. Python趣用—配平化学方程式

    不知不觉已经毕业多年了,不知道大家是否还记得怎么配平化学方程式呢?反正小编我是已经记不太清了,所以今天的文章除了分享如何用python配平化学方程式,顺带着还会复习 一些化学方程式的知识,希望广大化学 ...

  8. Git更改提交

    提交记录我们的工作历史记录,提交自身是一成不变的.Git提供了几个工具和命令,抓门用来帮助修改完善版本库中的提交. 实际工作中存在很多情况需要我们去修改或返工某个提交或者整个提交序列: 1,可以在某个 ...

  9. [PTA] 数据结构与算法题目集 6-8 求二叉树高度 & 6-9 二叉树的遍历

    6.8 二叉树高度 int GetHeight(BinTree BT) { if (BT == NULL) return 0; int leftH = GetHeight(BT->Left); ...

  10. 深入理解Java中的锁(一)

    Java中锁的概念 自旋锁 : 是指当一个线程在获取锁的时候,如果锁已经被其他线程获取,那么该线程将循环等待,然后不断判断锁是否能够被成功获取,直到获取到锁才会退出循环. 乐观锁 : 假定没有冲突,在 ...