1 Star 3 Fork 0

东哥传说/deploy

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
index.js 9.57 KB
一键复制 编辑 原始数据 按行查看 历史
const fs = require('fs');//引入模块
const path = require('path')//引入模块
const inquirer = require('inquirer');// 询问消息npm install --save inquirer@^8.0.0
const ora = require('ora');// 加载动画ora6.0以上版本不支持require方式引入,如果在node中使用,需要使用5.0版本
const childProcess = require('child_process');//windows cmd 模块
var targz = require('tar.gz');//windows 压缩格式为tar.gz模块
const { NodeSSH } = require('node-ssh');//链接ssh模块
const ssh = new NodeSSH();//创建实例ssh
const util = require('./util');//引入样式
try{
var { envSetting } = require(path.join(process.cwd()) + path.sep +'envConfig');//引入环境变量
}catch(e){
util.red('引入配置文件'+path.join(process.cwd()) + path.sep +'envConfig.js'+'报错,请查看是否手动配置该文件,详情见:https://www.npmjs.com/package/ahd-deploy');
return;
}
var fileNameSave = '';// 声明服务器备份文件夹名称
var configGlobal;// 声明环境对象在选择发布环境时赋值
/********************封装方法********************/
// 询问框
const confirmDeploy = (message) => {
return inquirer.prompt([
{
type: 'confirm',
name: 'confirm',
message
}
])
};
/********************封装方法********************/
// 执行打包命令
async function runBuild() {
const spinner = ora('正在打包中\n');
spinner.start();
await childProcess.exec(
configGlobal.buildCommand,
{ cwd: `${path.join(process.cwd())+ path.sep}`, maxBuffer: configGlobal.maxBuffer },
(e) => {
spinner.stop();
if (e === null) {
util.green('正在打包-成功');
// del/f/s/q C:\xunlei\xldl.dll 删除文件
buildZarGz();
} else {
if (e.message.includes('Command failed:')) {
util.red('打包命令错误');
} else {
util.red(e.message);
}
}
}
)
};
// 压缩文件为tar.gz
async function buildZarGz() {
// 创建我们需要的所有流
var read = targz().createReadStream(`${path.join(process.cwd())+ path.sep}` + configGlobal.buildFileName);
var write = fs.createWriteStream(`${path.join(process.cwd())+ path.sep}` + configGlobal.buildFileName + '.tar.gz');
read.pipe(write);
read.on('close', () => {
putServe()
})
};
// 链接到服务器
async function putServe() {
const spinner = ora('登录服务器中...\n');
spinner.start();
ssh.connect(configGlobal.configServer)
.then(() => {
spinner.stop();
util.green('登录服务器-成功');
remoteToBeTarGz()
}).catch((err) => {
spinner.stop();
util.red('SSH登录失败:\n', err);
});
};
// 压缩远程文件
async function remoteToBeTarGz() {
const spinner = ora('压缩远程文件中\n');
spinner.start();
await ssh.execCommand(
`tar -zcvf ${configGlobal.remoteFileRoot}backdist.tar.gz ${configGlobal.remoteFileRoot + configGlobal.remoteFileName}`
).then(function () {
spinner.stop();
// util.green('压缩远程文件-成功')
createFile1()
})
};
// 创建文件夹
async function createFile1() {
fileNameSave = configGlobal.remoteFileName + util.NowDate()
await ssh.execCommand(
`mkdir ${configGlobal.backFileRoot}` + fileNameSave
).then(function () {
util.green('创建备份文件夹-成功')
remoteRemoveBackFile()
})
};
// 解压远程文件到备份目录
async function remoteRemoveBackFile() {
let num = (configGlobal.remoteFileRoot + configGlobal.remoteFileName).split('/').length - 1
await ssh.execCommand(
`tar -zxvf ${configGlobal.remoteFileRoot}backdist.tar.gz --strip-components ${num} -C ${configGlobal.backFileRoot}` + fileNameSave
).then(function () {
util.green('备份文件-成功')
remoteDeleteFile()
})
};
// 删除远程文件
async function remoteDeleteFile() {
await ssh.execCommand(
`rm -rf ${configGlobal.remoteFileRoot + configGlobal.remoteFileName}`
).then(function () {
remoteDeleteFileTarGz()
})
};
// 删除远程文件压缩包
async function remoteDeleteFileTarGz() {
await ssh.execCommand(
`rm -f ${configGlobal.remoteFileRoot}backdist.tar.gz`
).then(function () {
createFile()
})
};
// 创建文件夹
async function createFile() {
await ssh.execCommand(
`mkdir ${configGlobal.remoteFileRoot + configGlobal.remoteFileName}`
).then(function () {
fileGoToServer()
})
};
// 上传文件到服务器
async function fileGoToServer() {
const spinner = ora('本地压缩文件上传到服务器\n');
spinner.start();
await ssh.putFiles([{ local: `${path.join(process.cwd())+ path.sep}` + configGlobal.buildFileName + '.tar.gz', remote: configGlobal.remoteFileRoot + configGlobal.buildFileName + '.tar.gz' }]).then(function () {
spinner.stop();
util.green("本地压缩文件上传到服务器-成功")
tarRemoteFile()
}, function (error) {
spinner.stop();
util.red("文件上传失败,错误信息:\n", error)
})
};
// 解压远程文件
async function tarRemoteFile() {
try {
const spinner = ora('解压到' + configGlobal.remoteFileName + '文件夹\n');
spinner.start();
await ssh.execCommand(
`tar -zxvf ${configGlobal.remoteFileRoot + configGlobal.buildFileName + '.tar.gz'} --strip-components 1 -C ${configGlobal.remoteFileRoot + configGlobal.remoteFileName}`
).then(function () {
spinner.stop();
util.green('解压到' + configGlobal.remoteFileName + '文件夹-成功')
remoteDeleteFileTarGz2()
})
} catch (e) {
console.log(e)
}
};
// 删除远程文件压缩包
async function remoteDeleteFileTarGz2() {
await ssh.execCommand(
`rm -f ${configGlobal.remoteFileRoot}dist.tar.gz`
).then(function () {
util.green('删除上传的压缩包-成功')
deleteLocalFile()
})
};
// 删除本地文件压缩包
function deleteLocalFile() {
fs.unlinkSync(`${path.join(process.cwd())+ path.sep}` + configGlobal.buildFileName + '.tar.gz', (error) => {
if (error) {
util.red(error);
util.red('本地打包文件删除失败,请手动删除');
} else {
util.green('删除本地的压缩包-成功')
}
});
util.green('断开ssh连接')
ssh.dispose()
console.timeEnd('总耗时');
// 结束node进程
process.exit();
};
//启动 自执行函数
(async function () {
// 环境配置校验
if (envSetting.length === 0) {
return util.red('请编辑环境配置在进行部署')
} else if (envSetting.length > 1) {
for (var i = 1; i < envSetting.length; i++) {
if (envSetting[0].envName === envSetting[i].envName) {
return util.red('环境名称重复 ' + path.join(process.cwd()) + path.sep +'envConfig.js (envName属性重复)')
}
}
}
// 打印提示
util.red('************************************************************************************************************')
util.red(String.raw`
__ __ __ ___
/\ \ /\ \ /\ \ /\_ \
__ \ \ \___ \_\ \ \_\ \ __ _____\//\ \ ___ __ __
/'__.\ \ \ _ .\ /'_. \ _______ /'_. \ /'__.\/\ '__.\\ \ \ / __.\/\ \/\ \
/\ \L\.\_\ \ \ \ \/\ \L\ \/\______\/\ \L\ \/\ __/\ \ \L\ \\_\ \_/\ \L\ \ \ \_\ \
\ \__/.\_\\ \_\ \_\ \___,_\/______/\ \___,_\ \____\\ \ ,__//\____\ \____/\/.____ \
\/__/\/_/ \/_/\/_/\/__,_ / \/__,_ /\/____/ \ \ \/ \/____/\/___/ ./___/> \
\ \_\ /\___/
\/_/ \/__/
`);
util.red('************************************************************************************************************')
util.purple('注意:')
util.purple('仅支持linux系统登录部署\n')
util.blue('流程:')
util.blue('本地打包➡ 本地生成压缩包➡ 登录服务器➡ 压缩远程文件➡ 将压缩的文件解压到备份文件夹➡ 删除压缩远程文件及远程文件夹 \n➡ 创建新的远程文件夹➡ 本地压缩包上传服务器➡ 解压到远程文件夹➡ 删除上传的远程压缩包➡ 删除本地压缩包➡ 完成')
util.red('************************************************************************************************************')
const answers = await confirmDeploy(
`是否开始部署项目?`
)
if (answers.confirm) {
var choices = envSetting.map(item => {
return item.envName
})
inquirer.prompt([
{
type: "list",
message: "请选择发布环境:",
name: "environment",
default: "",
// 前缀
prefix: "",
// 后缀
suffix: "",
choices
}
]).then(res => {
configGlobal = envSetting[choices.indexOf(res.environment)]
util.green(res.environment + ' 打包开始:' + configGlobal.buildCommand);
console.time('总耗时');
runBuild()
});
} else {
util.red('已取消部署')
}
})();
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/legend-of-dongge/deploy.git
git@gitee.com:legend-of-dongge/deploy.git
legend-of-dongge
deploy
deploy
master

搜索帮助