当前位置: 首页 > 后端技术 > Node.js

bgwd-deploy前端自动化部署服务器,告别繁琐的部署流程

时间:2023-04-03 10:24:16 Node.js

bgwd-deploy前端部署工具说到部署,很多人会想到Jenkinsdocker等,但是学习和使用的成本可能会让很多人望而却步。试试这个怎么样?三步项目github地址npm地址第一步npmibgwd-deploy-D第二步在你的项目package.json文件的scripts脚本下添加如下一行(比较粗糙,有更好的办法,请让我知道)"deploy":"node./node_modules/bgwd-deploy/index"第三步在你的项目根目录添加deploy.config.js文件,内容如下:然后就可以用npm部署了rundeploy.//关于团队成员PRIVATE_KEY不一致的问题,每个成员可以单独配置自己的PRIVATE_KEY,然后在.gitignore中添加deploy。config.js忽略上传//配置参考文件实际配置文件需要用户添加deploy.config.jsmodule.exports=Object.freeze({development:{//testSERVER_PATH:'xx.xxx.xx.xx',//sshaddress服务器地址SSH_USER:'root',//ssh用户名//登录方式(二选一,不用的方式注释掉)//方式一使用秘钥登录服务器(推荐),//put将服务器的authorized_keys文件中的id_rsa.pub放到本地公钥.ssh目录下,多台电脑公钥用换行符分隔//private本地私钥文件地址(需要在服务器用户配置公钥directory一般为~/.ssh/authorized_keys,文件权限为600,(.ssh文件夹一般默认隐藏)//一般.ssh在用户目录下,cd~/.ssh/,复制路径和放在pwd下,可以查看当前路径path带/不要\例如下面的C:/Users/Administrator/.ssh/id_rsaPRIVATE_KEY:'C:/Users/Administrator/.ssh/id_rsa',//方法二使用密码连接服务器//PASSWORD:'',PATH:'/test/h5',//需要上传的服务器的目录地址,如/usr/local/nginx/html/prodName//(该参数可选)默认是箭头4。加载动画有dotstodots12比如dots6,line,//pipe,star,arrowtoarrow4等等,更多见src项目下的spinner_style.jsLOADINGSTYLE:'arrow4',//SHELL:''//custom打包命令(没有请注意),默认npmrunbuild,可自定义如npmrunbuild:prd等},production:{//officialSERVER_PATH:'',SSH_USER:'root',PRIVATE_KEY:'',PATH:'/test/html',//LOADINGSTYLE:'arrow4',//SHELL:''}})大功告成~~查看项目代码可以看到主文件index.js项目依赖constchalk=require('chalk')//命令行颜色constora=require('ora')//加载过程动画constspinner_style=require('./spinner_style')//加载动画样式constshell=require('shelljs')//执行shell命令constnode_ssh=require('node-ssh')//ssh连接服务器constinquirer=require('inquirer')//命令行交互constzipFile=require('compressing')//zip压缩constfs=require('fs')//nodejs内置文件模块constpath=require('path')//nodejs内置路径模块constCONFIG=require('./config')//配置一些常量,变量和日志sconstSSH=newnode_ssh();让配置;//用于保存查询者命令行交互和选择官方|测试版本配置//logsconstdefaultLog=log=>console.log(chalk.blue(`-----------------${log}----------------`));consterrorLog=log=>console.log(chalk.red(`--------------${log}---------------`));constsuccessLog=log=>console.log(chalk.green(`----------------${log}--------------`));//文件夹目录constdistDir=path.resolve(__dirname,'../dist');//待打包constdistZipPath=path.resolve(__dirname,`../dist.zip`);//打包后的地址(dist.zip为文件名不用改,在config中配置PATH即可)打包首先执行项目打包命令//项目打包代码npmrunbuildconstcompileDist=async()=>{constloading=ora(defaultLog('项目开始打包')).start();loading.spinner=spinner_style.arrow4;shell.cd(path.resolve(__dirname,'../'));constres=awaitshell.exec('npmrunbuild');//执行shell打包命令loading.stop();if(res.code===0){successLog('项目打包成功!');}else{errorLog('项目打包失败,请重试!');进程.exit();//退出进程}}压缩然后打包代码/dist目录打包(如果不是dist,请更改上面disDir常量末尾的dist)//压缩代码constzipDist=async()=>{defaultLog('项目开始压缩');try{awaitzipFile.zip.compressDir(distDir,distZipPath)successLog('压缩成功!');}catch(错误){errorLog(错误);errorLog('压缩失败,退出程序!');进程.exit();//退出进程}}连接服务器那么通过ssh连接服务器有两种方式:一种是通过秘钥连接(推荐),一种是使用密码和秘钥连接需要将本地公钥放在服务器的指定目录下(upload/config.js中有说明)//连接服务器constconnectSSH=async()=>{constloading=ora(defaultLog('Connectingtoserver'))。开始();loading.spinner=spinner_style.arrow4;try{awaitSSH.connect({host:config.SERVER_PATH,username:config.SSH_USER,//privateKey:config.PRIVATE_KEY,//秘钥登录(推荐)方式一password:config.PASSWORD//密码登录方式二});successLog('SSH连接成功!');}catch(错误){errorLog(错误);errorLog('SSH连接失败!');进程.exit();//退出进程}loading.stop();}上传文件然后通过ssh执行在线命令清空目标目录,然后上传zip到服务器解压等//在线执行命令/****@param{String}command命令操作如ls*/construnCommand=async(command)=>{constresult=awaitSSH.exec(command,[],{cwd:config.PATH})//defaultLog(result);}//清除在线目标目录下的旧文件constclearOldFile=async()=>{constcommands=['ls','rm-rf*'];awaitPromise.all(commands.map(async(it)=>{returnawaitrunCommand(it);}));}//发送zip文件到服务器constuploadZipBySSH=async()=>{//连接到ssh等待connectSSH();//清除在线目标文件awaitclearOldFile();constloading=ora(defaultLog('准备上传文件')).start();loading.spinner=spinner_style.arrow4;try{awaitSSH.putFiles([{local:distZipPath,remote:config.PATH+'/dist.zip'}]);//本地本地;远程服务器;successLog('上传成功!');loading.text='解压文件';awaitrunCommand('unzip./dist.zip');//解压awaitrunCommand(`rm-rf${config.PATH}/dist.zip`);//解压后删除在线压缩包//将目标目录dist中的文件移动到目标文件中//比如我们只部署一个网站在/test/html目录下,然后上传并解压文件在/test/html/dist//你需要将dist目录下的文件移动到/test/html;在多个网站的情况下,例如/test/html/h5或者/test/html/admin同上awaitrunCommand(`mv-f${config.PATH}/dist/*${config.PATH}`);awaitrunCommand(`rm-rf${config.PATH}/dist`);//移出后删除dist文件夹SSH.dispose();//断开连接}catch(error){errorLog(error);errorLog('上传失败!');进程.退出();//退出进程}loading.stop();}将这些集成到一个函数中//------------释放程序-------------construnUploadTask=async()=>{console.log(chalk.yellow(`-------->欢迎使用Bogo2020自动部署工具<--------`));//包等待compileDist();//压缩等待zipDist();//连接服务器上传文件awaituploadZipBySSH();successLog('祝你好运,部署成功!');process.exit();}releaseCheckconfigurationbefore//启动前配置检查/****@param{Object}conf配置对象*/constcheckConfig=(conf)=>{constcheckArr=Object.entries(conf);checkArr.map(it=>{constkey=it[0];if(key==='PATH'&&conf[key]==='/'){//之前目标目录下的所有文件都会被清空正在上传ziperrorLog('PATH不能是服务器的根目录!');process.exit();//退出进程}if(!conf[key]){errorLog(`配置项${key}不能为空`);进程.exit();//退出流程}})}发布执行交互选择发布环境,启动发布程序//执行交互后启动发布程序查询器.prompt([{type:'list',message:'请选择发布environment',name:'env',choices:[{name:'testenvironment',value:'development'},{name:'正式环境',value:'production'}]}]).then(answers=>{config=CONFIG[answers.env];checkConfig(config);//检查runUploadTask();//发布});没有广告,没有打赏,如果觉得对你有点帮助,点个赞或者去GitHub点个star,那就非常感谢项目github地址