Web项目制品仓库构建

158 阅读1分钟

背景

在项目设计/POC阶段,演示项目的快速构建制品库演示。

规划与设计

  1. 规划制品库占用端口

image.png 2. 规划制品库占用目录

// 制品存储目录
/home/web/workbase/warehouse/
  1. Nginx作为Web服务器,以nodejs + mysql管理制品包及部署日志,部署过程通过动态修改nginx.conf,在规划区域增加、修改配置,通用exec重启Nginx服务完成。

界面

image.png

image.png

制品包部署

按照部署方式,可以定义唯一路由名称,默认部署在端口5001上。

    setNginx({ uuid, routeName,isRewrite }) {
        return new Promise((resolve, reject) => {
            // 这个api提供了node读写conf文件的功能
            NginxConfFile.create('/usr/local/nginx/conf/nginx.conf', function (err, conf) {
                if (err) {
                    console.log(err);
                    return;
                }
                // 存在多个模块是通过数组方式访问(5001--->对接制品仓库)
                let servers = conf.nginx.http[0].server;
                let isExistServer_5001 = servers.some(item => item.listen[0]._value == '5001')
                if (!isExistServer_5001) {
                    conf.nginx.http[0]._add('server');
                    servers[servers.length - 1]._add('listen', '5001');
                    servers[servers.length - 1]._add('server_name', 'localhost');
                }

                let server_5001 = servers.find(item => item.listen[0]._value == '5001')
                //root已经存在				
                if (server_5001.location) {
                    for (var i = server_5001.location.length - 1; i >= 0; i--) {
                        if (server_5001.location[i].root && server_5001.location[i].root[0]._value == `/home/web/workbase/warehouse/${uuid}`) {
                            server_5001._remove('location', i)
                        }
                    }		
		          for (var i = server_5001.location.length - 1; i >= 0; i--) {
                        if (server_5001.location[i]._value == `@rewrites_${routeName}`) {
                            server_5001._remove('location', i)
                        }
                    }
                    //路由匹配重复
                    let routeExp = `/${routeName}`
                    let isExistRouteName = server_5001.location.some(item => item._value == routeExp)
                    if (isExistRouteName) {
                        resolve(false);
                    }
                }

                // blocks with values:
                server_5001._add('location', `/${routeName}`);
                const locationLen = server_5001.location.length;
                server_5001.location[locationLen - 1]._add('root', `/home/web/workbase/warehouse/${uuid}`);
                server_5001.location[locationLen - 1]._add('index', 'index.html index.htm');			
				if(isRewrite == 1){
					server_5001.location[server_5001.location.length - 1]._add('try_files', `$uri $uri/ @rewrites_${routeName}`);
					server_5001._add('location', `@rewrites_${routeName}`);
					server_5001.location[server_5001.location.length - 1]._add('rewrite', `^(.*)$ /${routeName}/index.html last`);		
				}
                resolve(true);
            });
        })
    }
// 路由名称earth,即会在规划的server区域增加一条location
location /earth {
    root /home/web/workbase/warehouse/b204ea10-3501-11ee-97a8-456e7dae90d8;
    index index.html index.htm;
}

重写路由Rewrite用于解决React、Vue等打包项目router history模式下刷新白屏问题,单一静态Html制品包不用额外处理。

部署日志,采集标准部署的deploy.json信息获取git commit信息,完成部署监控。

image.png