Nodejs一键发布脚本

背景

前端项目或者nodejs项目分开发、测试、生产环境,有的没有没有接入 jenkins。每次都需要进行本地打包, 手动压缩上传到服务器目录,ssh 登录服务器后备份旧文件, 手动删除文件再将包解压到指定目录,操作流程比较繁琐,需要提前了解服务器部署目录,不太友好。

目标

  • 根据packeage.json 的scripts 来配置测试和生产环境的脚本。

  • 根据运行脚本获取相关环境的配置

  • 在部署脚本里面处理环境配置,然后实现

    • SSH登陆服务器

    • 压缩目录

    • 上传文件到服务器

    • 备份并删除服务器上的原文件

    • 解压服务器上的文件

需要用到的包

npm install dotenv dotenv-cli node-ssh silly-datetime archiver

以下是对这几个包的简要说明:

  1. dotenv:dotenv是一个流行的Node.js库,用于从.env文件中加载环境变量,并使其在应用程序中可用。它可以帮助您在开发过程中轻松管理环境变量,而无需硬编码到代码中。
  2. dotenv-cli:dotenv-cli是dotenv的命令行工具,它允许您在命令行中运行脚本时加载.env文件中的环境变量。这对于在命令行中运行脚本或执行其他命令时,临时设置环境变量非常有用。
  3. node-ssh:node-ssh是一个用于在Node.js中执行SSH操作的库。它提供了一组API,使您可以连接到远程服务器,执行命令,上传和下载文件等。它对于在Node.js应用程序中与远程服务器进行交互非常有用。
  4. silly-datetime:silly-datetime是一个简单的日期和时间格式化工具。它提供了一些函数,可以帮助您格式化日期和时间,例如将日期格式化为指定的字符串,获取当前时间戳等。
  5. archiver:archiver是一个用于创建和提取归档文件(如zip、tar等)的库。它提供了一组API,使您可以创建压缩文件,添加文件或文件夹到压缩文件中,以及从压缩文件中提取文件。它对于在Node.js中处理归档文件非常有用。

代码

环境变量文件 .env.test

SERVER_IP=47.xx.xx.209
SERVER_USER_NAME=root
SERVER_PASSWORD=xxxxxxx
SERVER_PROJECT_PATH=/www/wwwroot/xxxx
DIST_PATH=dist

package.json

"scripts": {"build-deploy:test": "dotenv -e .env.test node deploy.js","build-deploy:pro": "dotenv -e .env.production node deploy.js",}

部署代码 deploy.js

const fs = require('fs');
const path = require('path');
const archiver = require('archiver');
const {NodeSSH} = require('node-ssh');
const sd = require('silly-datetime');
// 加载配置文件
require('dotenv').config()
// 当前时间
const curTime = sd.format(new Date(), 'YYYYMMDDHH');
const distPath = path.resolve(__dirname, process.env.DIST_PATH);
const ssh = new NodeSSH();
// 远程服务器配置信息
let config = {host: process.env.SERVER_IP,username: process.env.SERVER_USER_NAME,password: process.env.SERVER_PASSWORD,pathUrl: process.env.SERVER_PROJECT_PATH,
}// 本地文件上传至远程服务器
async function uploadFile() {try {await ssh.connect({host: config.host,username: config.username,password: config.password,port: 22,});console.log('SSH login success');await ssh.putFile(`${__dirname}/dist${curTime}.zip`,`${config.pathUrl}/dist${curTime}.zip`);console.log('The zip file is uploaded successfully');remoteFileUpdate();} catch (err) {console.log('The file upload failed:', err);process.exit(0);}
}// 服务端远端文件解压,更新
async function remoteFileUpdate() {let cmd =`mv dist dist.bak${curTime} && unzip dist${curTime}.zip`;try {const result = await ssh.execCommand(cmd, {cwd: config.pathUrl,});console.log(`The update message is: ${result.stdout}`);if (!result.stderr) {console.log('Congratulations! Update success!');process.exit(0);} else {console.log('Something went wrong:', result);process.exit(0);}} catch (err) {console.log('SSH connection failed:', err);process.exit(0);}
}// 本地文件压缩
function zipDirector() {try {const output = fs.createWriteStream(`${__dirname}/dist${curTime}.zip`);const archive = archiver('zip', {zlib: {level: 9},});output.on('close', (err) => {if (err) {console.log('Something went wrong with 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);//要压缩的文件夹路径,和输出路径// 设置本地 dist 文件路径console.log(distPath)// 将指定目录打包压缩到压缩包中,并且重命名为h5archive.directory(distPath, "dist");archive.finalize();} catch (e) {console.log(e)}
}(function() {// 更新代码zipDirector();
})()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/646439.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue2学习之第六、七章——vue-router与ElementUI组件库

路由 理解: 一个路由(route)就是一组映射关系(key - value),多个路由需要路由器(router)进行管理。前端路由:key是路径,value是组件。 1.基本使用 安装vue-…

蓝桥杯基础准备2

一、排序库 1.1 数组排序 默认升序。 int[] a {1,2,5,8,3,4,6}; Arrays.sort(a); int len a.length; for(int i 0;i<len;i) {System.out.print(a[i]" "); } 用Lambda实现升序&#xff1a; //自定义排序使用lambda表达式 //一维数组要使用引用数据类型 Int…

李沐《动手学深度学习》深度学习计算

系列文章 李沐《动手学深度学习》预备知识 张量操作及数据处理 李沐《动手学深度学习》预备知识 线性代数及微积分 李沐《动手学深度学习》线性神经网络 线性回归 李沐《动手学深度学习》线性神经网络 softmax回归 李沐《动手学深度学习》多层感知机 模型概念和代码实现 李沐《…

Java设计模式中的代理模式

Java设计模式中的代理模式 代理模式是一种结构型设计模式&#xff0c;它提供了一个代理对象&#xff0c;以控制对其他对象的访问。代理可以充当中介&#xff0c;用于控制对真实对象的访问。 代码举例演示 静态代理&#xff1a; // 接口 interface Subject {void request();…

使用 LinkAi 打造自己的知识库和数字人

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、LinkAi 介绍 二、文档库 2.1 创建知识库 2.2 配置知识库 2.3 Ai配置 2.4 导入文档 2.5 接入微信 三、扩展 四、总结…

结合CSS一些样式属性和属性值进行案例演示

案例演示 图1 1.结构分析 文字部分用<p>标签定义&#xff0c;对于特殊显示的文本&#xff08;如导语、详情&#xff09;等可以用<em>、<strong>等格式化标签来定义&#xff0c;效果图如图2。 图2 2.样式分析 &#xff08;1&#xff09;控制段落文本的字体…

一种改进的小龙虾优化算法大|Crayfish optimization algorithm(COA)|首次公开—原创代码

1、简介 本文介绍一种新的全局优化算法——小龙虾优化算法Crayfish optimization algorithm&#xff08;COA&#xff09;&#xff0c;模拟了小龙虾的避暑行为、竞争行为和觅食行为。该成果于2023年9月最新发表在Artifcial Intelligence Review。 COA的灵感来自小龙虾的避暑、…

Spring Boot更换Spring fox为Springdoc

文章目录 项目场景引入使用打完收工&#xff01; 项目场景 由于项目中使用Spring fox已经不维护更新了&#xff0c;代码扫描&#xff0c;扫出问题&#xff0c;需要将Spring fox更换为Spring Doc。 由于我们封装的框架有个配置需要关掉&#xff0c;否则就会查看相关依赖&#x…

springboot农机电招平台源码和论文

随着农机电招行业的不断发展&#xff0c;农机电招在现实生活中的使用和普及&#xff0c;农机电招行业成为近年内出现的一个新行业&#xff0c;并且能够成为大群众广为认可和接受的行为和选择。设计农机电招平台的目的就是借助计算机让复杂的销售操作变简单&#xff0c;变高效。…

异常检测(Anomaly Detection)

1.问题的动机 什么是异常检测呢&#xff1f;为了解释这个概念&#xff0c;让我举一个例子吧&#xff1a; 假想你是一个飞机引擎制造商&#xff0c;当你生产的飞机引擎从生产线上流出时&#xff0c;你需要进行QA(质量控制测试)&#xff0c;而作为这个测试的一部分&#xff0c;你…

CSS自适应分辨率 postcss-pxtorem(适用于 Vite)

前言 此篇是基于 Vite Vu3 项目的 CSS 自适应分辨率&#xff01; 如果想知道基于 Webpack Vue2 可移步 《CSS自适应分辨率 amfe-flexible 和 postcss-pxtorem&#xff08;适用于 Webpack&#xff09;》 项目对应的主要插件版本如下&#xff1a; "vite": "^4…

【监听下拉框传参获取数据】

一&#xff1a; 写好结构 <el-form-item label"级别" prop"level"><el-select v-model"form.level" placeholder"请选择级别"><el-optionv-for"item in levelList":key"item.value":label"it…

纳斯达克VS路透社MIFI大屏直投-大舍传媒

纳斯达克VS路透社MIFI大屏直投-大舍传媒 引言 在数字时代的今天&#xff0c;大屏投放成为一种广泛应用的营销手段和传媒方式。纳斯达克大屏和路透社MIFI大屏作为两个重要的投放平台&#xff0c;为企业和机构提供了广告和宣传的机会。 纳斯达克大屏的魅力 纳斯达克大屏位于纽…

Wpf 使用 Prism 实战开发Day14

备忘录接口增删&#xff08;CURD&#xff09;改查实现 一.添加备忘录控制器&#xff08;MemoController&#xff09; 备忘录控制器&#xff08;MemoController&#xff09;和待办事项控制器 &#xff08;ToDoController&#xff09;功能实现差不多一样。基本套路就是&#xff1…

写点东西《JavaScript 中的递归》

写点东西《JavaScript 中的递归》 您是否曾经发现自己需要在 JavaScript 中循环遍历一个复杂的多维对象&#xff0c;却不知道如何操作&#xff1f; 那么&#xff0c;递归函数到底是什么&#xff1f; 让我们回到我们的树对象。 为什么使用递归&#x1f31f;更多精彩 您是否曾经发…

京东按关键字搜索商品 API(item_search-按关键字搜索商品-onebound.jd.item_search)

京东提供了API接口供开发者进行商品搜索。要使用这个API&#xff0c;首先需要去京东开放平台注册一个账号并创建一个应用&#xff0c;然后获取到应用的API密钥。 关于按关键字搜索商品的API接口&#xff0c;京东开放平台提供了item_search这个接口。以下是这个接口的基本使用方…

LabVIEW工业机器人系统

介绍了ABB工业机器人与LabVIEW之间进行数据交互的解决方案。通过使用TCP/IP协议的socket通信&#xff0c;实现了机器人坐标数据的读取&#xff0c;为人机交互提供了一个更便捷、更高效的新思路。 系统主要由ABB工业机器人、基于TCP/IP协议的通信接口和LabVIEW软件组成。工业机…

鸿蒙常用UI效果及一些处理方式总结

前言&#xff1a; DevEco Studio版本&#xff1a;4.0.0.600 详细使用介绍 1、Text的一些常用设置 Text(this.message).fontSize(50)//字体大小.fontColor(Color.White)//字体颜色.fontWeight(FontWeight.Bold)//字体加粗.backgroundColor(Color.Black)//背景颜色.fontStyle(…

【Java】小白友好的Servlet基础学习笔记

后面比赛挺多&#xff0c;RW体验赛&#xff0c;西湖论剑&#xff0c;beginCTF&#xff0c;N1CTF&#xff0c;hgame&#xff0c;NSS新春赛&#xff0c;NSS Round17&#xff0c;SICTF&#xff0c;有观赏性大于操作性的&#xff0c;有萌新可以真正去打的。经过慎重考虑&#xff0c…

[安全警报] Npm木马利用“Oscompatible“包悄然安装AnyDesk

最近&#xff0c;一个名为OsCompatible的恶意包被上传到npm 。该包被发现包含一个针对 Windows 的远程访问木马。 这个名为OsCompatible的软件包于2024年1月9日发布&#xff0c;在被撤下之前共吸引了380次下载。 据了解&#xff0c;OsCompatible包含“几个奇怪的二进制文件”…