发布平台页面

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>发布平台</title>
  8. </head>
  9. <style>
  10. body {
  11. padding-left: 60px;
  12. }
  13. .obj-container {
  14. display: flex;
  15. align-items: center;
  16. height: 40px;
  17. margin-bottom: 15px;
  18. user-select: none;
  19. }
  20. .obj-name {
  21. width: 100px;
  22. height: 40px;
  23. font-size: 20px;
  24. font-weight: bold;
  25. color: #333333;
  26. line-height: 40px;
  27. }
  28. .obj-btn {
  29. width: 50px;
  30. height: 20px;
  31. border-radius: 2px;
  32. background: #0091ff;
  33. color: white;
  34. display: flex;
  35. justify-content: center;
  36. align-items: center;
  37. font-size: 12px;
  38. cursor: pointer;
  39. }
  40. </style>
  41. <body>
  42. <!-- 标题显示 -->
  43. <h1>请点击发布按钮进行发布</h1>
  44. <!-- 发布平台主要内容 -->
  45. <div id="container"></div>
  46. </body>
  47. </html>
  48. <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
  49. <script>
  50. window.onload = function () {
  51. // 获取到容器
  52. const container = document.getElementById("container");
  53. // 需要发布的应用列表
  54. const dirList = ["main", "react15", "react16", "vue2", "vue3"];
  55. let html = "";
  56. dirList.forEach((item) => {
  57. html += `
  58. <div class="obj-container">
  59. <div class="obj-name">${item}</div>
  60. <div class="obj-btn" id="${item}">发布</div>
  61. </div>
  62. `;
  63. });
  64. container.innerHTML = html;
  65. // 添加发布的功能
  66. container.onclick = function (e) {
  67. if (e.target.className !== "obj-btn") {
  68. return;
  69. }
  70. $.get(`http://localhost:3001/start?name=${e.target.id}`);
  71. };
  72. };
  73. </script>

创建部署平台服务

  1. npm install express express-generator -g
  2. express -e server

解决跨域

  1. // 设置允许跨域
  2. app.all('*', function (req, res, next) {
  3. res.header('Access-Control-Allow-Origin', '*');
  4. next();
  5. });

根据版本号创建目录

  1. router.get('/start', function (req, res, next) {
  2. const name = req.query.name
  3. // console.log(versionDir)
  4. // 确认要更新的版本号, 每一个应用独立一个文件管理版本
  5. // 创建一个文件,默认的版本号
  6. // 创建当前应用的路径
  7. const currentUrl = path.join(versionDir, name)
  8. let newVersion = ''
  9. changeVersion()
  10. // 处理版本号
  11. function changeVersion() {
  12. // 如果读取当前应用版本文件错误,就创建一个文件,写入我们的版本信息
  13. try {
  14. const originVersion = fs.readFileSync(currentUrl).toString().replace(/\n/g, '')
  15. // console.log('originVersion:', originVersion)
  16. newVersion = originVersion.replace(/\.(\d+)$/, (a, b) => `.${+b + 1}`)
  17. // console.log('newVersion:', newVersion)
  18. fs.writeFileSync(currentUrl, newVersion)
  19. } catch (error) {
  20. fs.writeFileSync(currentUrl, initVersion)
  21. }
  22. }
  23. }

打包构建流程

  1. router.get('/start', function (req, res, next) {
  2. const name = req.query.name
  3. // console.log(versionDir)
  4. // 确认要更新的版本号, 每一个应用独立一个文件管理版本
  5. // 创建一个文件,默认的版本号
  6. // 创建当前应用的路径
  7. const currentUrl = path.join(versionDir, name)
  8. let newVersion = ''
  9. changeVersion()
  10. startBuild()
  11. // 处理版本号
  12. function changeVersion() {
  13. // 如果读取当前应用版本文件错误,就创建一个文件,写入我们的版本信息
  14. try {
  15. const originVersion = fs.readFileSync(currentUrl).toString().replace(/\n/g, '')
  16. // console.log('originVersion:', originVersion)
  17. newVersion = originVersion.replace(/\.(\d+)$/, (a, b) => `.${+b + 1}`)
  18. // console.log('newVersion:', newVersion)
  19. fs.writeFileSync(currentUrl, newVersion)
  20. } catch (error) {
  21. fs.writeFileSync(currentUrl, initVersion)
  22. }
  23. }
  24. // 构建 打包 发布
  25. function startBuild() {
  26. const originPath = path.join(__dirname, '../../../', name) // 项目路径
  27. const originDist = path.join(originPath, 'dist') // 项目打包后的产物路径
  28. const bagPath = path.join(__dirname, '../bag') // 存放打包后的产物
  29. // 通过运行打包命令来创建对应的打包产物
  30. try {
  31. // 创建bag目录
  32. execSync(`mkdir ${bagPath}`)
  33. // 清空当前项目下所有资源
  34. execSync(`rm -rf ${bagPath}/${name}`)
  35. // 创建项目目录
  36. execSync(`mkdir ${bagPath}/${name}`)
  37. // 进入应用目录进行打包
  38. execSync(`cd ${originPath} && npm i && npm run build`)
  39. // 创建版本目录
  40. execSync(`cd ${bagPath} && mkdir -p ./${name}/${newVersion}`);;
  41. // mkdir(`./${bagPath}/${name}/${newVersion}`);
  42. // 将打包后的产物,存入bag文件夹对应版本目录下
  43. const lastDist = path.join(bagPath, `./${name}/${newVersion}`)
  44. execSync(`mv ${originDist}/* ${lastDist}`)
  45. } catch (e) {
  46. console.log(e);
  47. }
  48. }
  49. res.send({
  50. version: newVersion,
  51. })
  52. });
  • 在windows下使用execSync创建目录报错,可以试试下面这个方法 ```javascript var fs = require(‘fs’); var path = require(‘path’);

// 创建多级目录 exports.mkdirSync = function (dirPath) { if (dirPath == null || dirPath == “”) return; dirPath = exports.isAbsolute(dirPath) ? path.normalize(dirPath) : path.join(process.cwd(), dirPath); if (fs.existsSync(dirPath)) return;

var arr = dirPath.split(path.sep); var index = arr.length - 1; var tempStr = arr[index]; while (tempStr == “” && arr.length > 0) { index—; tempStr = arr[index]; } if (tempStr == “”) return; var newPath = dirPath.substring(0, dirPath.length - tempStr.length - 1); if (!fs.existsSync(newPath)) exports.mkdirSync(newPath); fs.mkdirSync(dirPath); }

exports.isAbsolute = function (filePath) { filePath = path.normalize(filePath); if (filePath.substring(0, 1) == “/“) return true; if (filePath.search(/[\w]+:/) == 0) return true; return false; }; ```