node+ts 设计前端自动部署命令

212 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情

前一篇完成了node-ssh连接数据库,本篇完善一下 deploy-cli go 命令, 完成部署功能。

思路

部署的大致思路如下:

先将服务器的上个版本下载下来, 将旧版本打包,删除旧版本, 上传文件,创建log,记录每次上传的操作。

实现

下载服务器的文件

使用getDirectory方法,在当前目录创建一个临时文件夹,读取配置文件 remoteFile的值, 从目标服务器的位置将文件复制下来。

spinner.succeed(chalk.green("服务器连接成功"));
spinner.start(chalk.blue("开始下载目标目录..."));
const dirPath = `${new Date().getFullYear()}-${
  new Date().getMonth() + 1
}-${new Date().getDate()}-${new Date().getTime()}`;
mkdirSync(dirPath);
const getres = await nodeSSH.getDirectory(dirPath, config.remoteFile);
if (getres) {
  spinner.succeed(chalk.green("目标目录下载成功"));
} else {
  spinner.fail(chalk.red("目标目录下载失败"));
}

将下载的文件压缩到目标位置

读取配置文件的versionSrc的值, 检测该文件夹是否存在,不存在的话创建一个,使用之前封装的tarFolder方法压缩之后,将临时文件夹删除。

 spinner.start(chalk.blue("正在压缩包检测目录是否存在"));
  const hasVersion = statSync(config.versionSrc, {
    throwIfNoEntry: false,
  });
  if (!hasVersion) {
    spinner.start(chalk.blue("正在创建目录"));
    mkdirSync(config.versionSrc);
    spinner.succeed(chalk.green("压缩包目录创建成功"));
  }
  {
    spinner.succeed(chalk.green("压缩包路径检测完成"));
  }
  await tarFolder(`${config.versionSrc}\\${dirPath}`, dirPath);
  rmSync(dirPath, {
    recursive: true,
  });

删除服务器的文件

这里要注意的是window服务器得启动powersheel, 当服务器为window server 时, 需要在配置文件中添加iswin: true.

spinner.start(chalk.blue("开始删除服务器文件"));
const rmres = await nodeSSH.execCommand(
  config?.iswin
    ? `powershell.exe rm -r ${config.remoteFile}/*`
    : `rm -r ${config.remoteFile}/*`
);
if (rmres.code) {
  spinner.fail(chalk.red("删除服务器文件失败"));
} else {
  spinner.succeed(chalk.green("删除服务器文件完成"));
}

上传文件

读取配置文件中的本地文件地址localFile和服务器文件remoteFile, 开始上传

spinner.start(chalk.blue("开始上传文件"));
const putres = await nodeSSH.putDirectory(
  config.localFile,
  config.remoteFile
);
if (putres) {
  spinner.succeed(chalk.green("文件上传成功"));
} else {
  spinner.fail(chalk.red("文件上传失败"));
}

记录log

读取配置文件中的logSrclogSrc需要带文件名,创建文件,在末尾写入操作。

spinner.start(chalk.blue("正在记录log"));
const log = openSync(config.logSrc ?? "log.md", "a");
writeSync(
  log,
  `\n${new Date().getFullYear()}${
    new Date().getMonth() + 1
  }${new Date().getDate()}日, 成功上传版本, 上一个版本为 ${dirPath}\n`
);
spinner.succeed(chalk.green("记录完成"));

测试

pnpm test
deploy-cli go

结果如下:

image.png

image.png