翼度科技»论坛 编程开发 JavaScript 查看内容

作为前端leader,如何搭建属于我们公司自己的流水线自动化部署系统(node+ex

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
背景:自动化部署系统主要可以集成到公司内部的管理系统中去,比如公司有多个项目,移动端H5,大屏网站,门户网站等...每次发布或者迭代都需要前端同事打包然后在交给运维或者后端同事放到服务器上进行部署
,如果有一个项目多个同事合作完成 还要走git合并流程,所以我们的目标就是不让前端进行打包,开发完成代码后 直接提交就行,通过点击管理后台的某个按钮触发某个平台的前端项目自动更新,同时也不需要
在交付给运维或者后端,便携式与流程管理,实现自动化部署(这里只说自己实现的,当然你们也可以去接入腾讯或阿里的自动化流水部署系统,但是某些环境下只能使用自己的如何去实现)
 这里做一个简单的版本和实现代码,可以自己扩展回滚本版,本版记录等,发布人员落实在责任人等...
1.创建一个干净的express项目,写一个空接口吧下面代码放进去,调用就执行
  1. const shell = require('shelljs');
  2. var fs = require('fs');
  3. var path = require('path');
  4. const { exec } = require('node:child_process');
  5. // 1.切换到服务器中储存的项目地址目录
  6. const project_path = '/www/wwwroot/menghangl/public/test';
  7. shell.cd(project_path);
  8. // 2.删除打包的旧前端dist文件
  9. function deleteDir(url) {
  10.   if (fs.existsSync(url)) {
  11.     fs.readdirSync(url).forEach(function(file, index) {
  12.       var curPath = path.join(url, file);
  13.       if (fs.statSync(curPath).isDirectory()) {
  14.         // 如果是文件夹,则递归调用deleteDir函数
  15.         deleteDir(curPath);
  16.       } else {
  17.         // 如果是文件,则删除文件
  18.         fs.unlinkSync(curPath);
  19.       }
  20.     });
  21.     // 删除文件夹
  22.     fs.rmdirSync(url);
  23.   } else {
  24.     console.log("给定的路径不存在!");
  25.   }
  26. };
  27. deleteDir('/www/wwwroot/menghangl/public/test/dist');
  28. // 3.执行打包命令
  29. const command = 'npm run build';
  30. // 打包展示的进度
  31. let schedule = 0;
  32. // 打包成功回调
  33. let build = exec(command, (error, stdout, stderr) => {
  34.   if (error) {
  35.     console.error(`exec error打包失败: ${error}`);
  36.     return;
  37.   }
  38.   schedule = 0;
  39.   console.log('打包成功,打包结束在这里结束接口请求,或者断开长连接')
  40. });
  41. // 4打包进度实时显示 并输出打包步骤
  42. build.stdout.on('data', function(data) {
  43. if(schedule!==100){
  44.      console.log(`Program output 【${schedule}%】`,data)
  45.      schedule += 20;
  46. } else {
  47.      console.log(data)
  48. }
  49. });
复制代码
 
2.服务端通过git获取最新仓库内容
  1. const shell = require('shelljs');
  2. var fs = require('fs');
  3. var path = require('path');
  4. const { exec } = require('node:child_process');
  5. //判定git命令是否可用
  6. if (!shell.which('git')) {
  7.     //向命令行打印git命令不可用的提示信息
  8.     shell.echo('Sorry, this script requires git');
  9.     //退出当前进程
  10.     shell.exit(1);
  11. } else {
  12.     console.log('可以使用')<br>// 切换到要拉取的文件夹目录
  13.     shell.cd('/www/wwwroot/menghangl/public/test_git');<br>// 远程仓库的git命令与地址
  14.     const command = 'git clone https://gitee.com/martins_coachman/blog-vue3-b.git';
  15.     let build = exec(command, (error, stdout, stderr) => {
  16.      if (error) {
  17.          console.error(`拉取失败: ${error}`);
  18.         return;
  19.      }
  20.      console.log('拉取成功')
  21.     });
  22. }
复制代码
 
3.优化与部署流程建议

上面两部分就是核心代码
1.首先先要自己部署一个node服务到服务器
2.写一个接口吧第一步骤放进去 在打包成功的地方结束请求,也可以用长连接,通过开启和关闭开实现
并且实时显示打包进度和状态
3.如果要使用git,自动同步代码,就先拉取等待拉取完成回调后,在执行打包逻辑代码
4.注意打包的时候会占用较多的cpu与内存,所以建议一个一个任务去执行,避开流量高峰期
5.解决这个的方法还有一个,就是在本地打包成功后直接git提交代码包括打包后的文件,服务器直接拉取最新代码即可
6.另外由于打包是在服务端进行,所以有时候我们开发功能添加了新的npm库 需要更新 node_modules包,建议先执行cnpm i 在去执行npm run build
7.最后可能node_modules会变的比较大 非常占用服务器硬盘空间 所以建议每次打包完成后删除 node_modules 包
 
这样就可以 用列表选择的方式在后台管理系统进行配置 动态传入不同的项目地址,远程仓库地址,执行命令等,通过后台管理系统像表单一样填写然后执行打包完成!
 

来源:https://www.cnblogs.com/Allen-project/p/18010035
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具