一起养成写作习惯!这是我参与「掘金日新计划 · 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
读取配置文件中的logSrc,logSrc需要带文件名,创建文件,在末尾写入操作。
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
结果如下: