没有CICD,怎么自动化部署?

不久前写了一个全新项目,包括服务器也是新的,所以没有CICD流水线

写完项目需要自己部署更新到服务器上

一开始是直接build,再用XshellXftp连接服务器手动替换文件来实现更新部署

但是这样不仅容易替换错,还耗时耗力

所以想着自己弄一个简单的自动化部署SSH

主要是通过 node-ssh 进行 SSH 连接并执行命令,上传文件夹,完成部署工作。下面来逐步解析,并说明 SSH 的使用。

1. 引入相关模块

javascript 复制代码
import { NodeSSH } from 'node-ssh';
import { deployConfig } from './config.js';
import path from 'path';
  • NodeSSH: 这是 node-ssh 库的核心模块,提供了与远程服务器通过 SSH 协议进行通信的功能。

  • deployConfig: 从外部的 config.js 文件导入配置信息,通常这个配置会包含 SSH 连接所需的信息(如服务器地址、用户名、私钥路径等)。

    javascript 复制代码
       export const deployConfig = {
           host: '服务器地址',
           username: '服务器名称',
           password: '服务器密码'
         }
  • path: Node.js 内建的模块,用于处理文件路径和目录。

2. 获取当前目录路径

javascript 复制代码
const __dirname = path.dirname(new URL(import.meta.url).pathname);
  • 由于你的代码使用了 ESM 模块(通过 importexport),__dirname 在这种模式下并不存在。为了获取当前文件所在的目录路径,使用了 path.dirname()import.meta.url 来实现获取路径。

3. 部署函数 deploy

javascript 复制代码
async function deploy() {
  const ssh = new NodeSSH();
  • 创建了一个 NodeSSH 实例 ssh,它将用于与远程服务器进行连接、执行命令以及文件上传等操作。

4. 连接到远程服务器

javascript 复制代码
await ssh.connect(deployConfig);
console.log('SSH 连接成功!');
  • ssh.connect(deployConfig):这个方法会使用 deployConfig 中的配置来连接到远程服务器。deployConfig 包含了你连接 SSH 所需要的所有信息,如 host, username, privateKey 等。
  • 如果连接成功,打印出 "SSH 连接成功!"

5. 执行命令

javascript 复制代码
const result = await ssh.execCommand('ls');
console.log('命令执行结果:', result);
  • execCommand('ls'):在远程服务器上执行 ls 命令,通常用来列出远程目录的文件。这个方法会返回一个包含命令执行结果的对象,包含 stdoutstderr 字段(分别表示标准输出和错误输出)。
  • 将命令的执行结果打印到控制台。

6. 执行部署脚本

javascript 复制代码
const deployScript = `
  cd nginx下载地址;
`;
const deployResult = await ssh.execCommand(deployScript);
console.log('部署脚本执行结果:', deployResult);
  • 你定义了一个部署脚本,脚本的内容是进入 nginx的 目录。虽然这个脚本很简单,但通常部署脚本会包含更多的操作,比如下载代码、配置文件修改等。
  • 然后通过 execCommand 执行这个脚本,并打印执行结果。

7. 准备上传本地文件夹

javascript 复制代码
let localDistPath = path.join(path.dirname(__dirname), 'dist');
localDistPath = localDistPath.replace(/^\\+/, '');
  • 这里使用了 path.join() 结合 __dirname 来确定本地 dist 文件夹的路径。path.dirname(__dirname) 取的是当前文件的父级目录,再通过 path.join() 加上 'dist',确定了本地的 dist 文件夹路径。
  • 然后使用 replace(/^\\+/, '') 来去除路径开头的多余反斜杠(\\+ 表示匹配一个或多个反斜杠)。

8. 定义远程路径

javascript 复制代码
const remoteDistPath = '服务器默认打开文件夹地址';
  • 这是远程服务器的目标目录,你希望将本地的 dist 文件夹上传到该目录。

9. 上传文件夹到远程服务器

javascript 复制代码
const uploadResult = await ssh.putDirectory(localDistPath, remoteDistPath, {
  recursive: true,
  concurrency: 10,
});
  • putDirectory(localDistPath, remoteDistPath, options):这是 node-ssh 提供的一个方法,用于将本地的整个目录上传到远程服务器。
    • localDistPath: 本地的 dist 文件夹路径。
    • remoteDistPath: 远程服务器上的目标路径。
    • options: 配置项,recursive: true 表示递归上传子目录,concurrency: 10 表示最多同时上传 10 个文件,优化上传速度。
  • 上传操作的结果存储在 uploadResult 中,这个对象包含上传过程中的信息。

10. 打印上传结果

javascript 复制代码
console.log('上传结果:', uploadResult);
  • 将上传的结果打印到控制台。uploadResult 将包含上传文件的状态信息。

11. 错误处理

javascript 复制代码
} catch (err) {
  console.error('SSH 连接或命令执行出错:', err);
}
  • 如果连接或命令执行中发生错误,catch 语句会捕获到错误,并打印出来。

12. 调用 deploy 函数

javascript 复制代码
deploy();
  • 最后,调用 deploy 函数来启动部署过程。

至此,自动化部署的配置文件已经完成,接下来就是使用

  • 在package里配置运行指令:不需要单独打包和运行部署,使用&&直接一键打包并部署
javascript 复制代码
    "deploy": "rimraf dist && NODE_OPTIONS=--max-old-space-size=8192 vite build && node scripts/node_ssh.js",
  • 🆗,直接快乐玩耍,pnpm run deploy 直接一键打包且部署到指定服务器

总结

  1. SSH 连接 :通过 ssh.connect() 连接到远程服务器,成功连接后可以执行命令或上传文件。
  2. 命令执行 :使用 execCommand() 执行远程命令,并获得结果。
  3. 上传文件夹 :通过 putDirectory() 方法将本地目录上传到远程服务器。
  4. 错误处理 :通过 try-catch 捕获可能发生的错误并输出日志。

这个流程适用于自动化部署的场景,可以将本地的构建产物上传到远程服务器,并执行必要的命令来完成部署。


至此,实现基础的自动化部署功能

相关推荐
dog shit19 分钟前
web第十次课后作业--Mybatis的增删改查
android·前端·mybatis
我有一只臭臭20 分钟前
el-tabs 切换时数据不更新的问题
前端·vue.js
七灵微23 分钟前
【前端】工具链一本通
前端
Nueuis1 小时前
微信小程序前端面经
前端·微信小程序·小程序
_r0bin_4 小时前
前端面试准备-7
开发语言·前端·javascript·fetch·跨域·class
IT瘾君4 小时前
JavaWeb:前端工程化-Vue
前端·javascript·vue.js
zhang98800004 小时前
JavaScript 核心原理深度解析-不停留于表面的VUE等的使用!
开发语言·javascript·vue.js
potender4 小时前
前端框架Vue
前端·vue.js·前端框架
站在风口的猪11084 小时前
《前端面试题:CSS预处理器(Sass、Less等)》
前端·css·html·less·css3·sass·html5
程序员的世界你不懂5 小时前
(9)-Fiddler抓包-Fiddler如何设置捕获Https会话
前端·https·fiddler