项目编译优化

621 阅读1分钟

全流程上线

flowchart LR
 jira(项目创建)
 development(项目研发)
 branch(添加模块&分支)
 test(项目测试&bug修复)
 artifact(文件归档)
 deployTest(部署测试环境)
 deploy(项目上线)
 deployPre(部署生产环境)

 jira --> development --> test --> deploy
 development --> branch
 test ---> artifact ---> deployTest
 deploy --> artifact ---> deployPre

 classDef boxUi fill:#ee5;
 class jira,development,test,deployPre,deploy boxUi;
 
 classDef artifactUI fill:#aea,stroke-dasharray: 4;
 class artifact artifactUI;

细化节点内容

flowchart LR
 jira(项目创建)
 development(项目研发)
 branch(添加模块&分支)
 test(项目测试&bug修复)
 artifact(文件归档)
 subgraph deployTestEnv[部署测试环境]
 	deployTest(部署测试环境)
 	deployTest1(部署测试环境)
 	deployTest2(部署测试环境)
 end
 deploy(项目上线)
 subgraph deployProdEnv[部署生产环境]
 	deployPre(部署生产环境)
 	deployProd(部署生产环境)
 	deployPre --> deployProd
 end
 
 jira --> development --> test --> deploy
 development --> branch
 test ---> artifact -..-> deployTest & deployTest1 & deployTest2
 deploy --> artifact ----> deployPre


 classDef boxUi fill:#ee5;
 class jira,development,test,deployPre,deploy boxUi;
 
 classDef artifactUI fill:#aea,stroke-dasharray: 4;
 class artifact artifactUI;
 

上线流程优化

优化前端项目速度

当前现状

flowchart LR
 install(项目安装)
 compile(项目编译)
 build(镜像构建)
 deploy(镜像部署)
 install --> compile --> build --> deploy 
 classDef boxUi fill:#aef,stroke-dasharray: 4;
 class install boxUi;
 

==当前可优化的节点== 项目安装

70%的更改 都是业务代码的修改, 一般不会修改package.json,所以有必要将node_module进行缓存,这样可以减少安装等待时间。

1. 当前任务前端流程

安装编译部分

1. FROM 192.168.100.36:1179/xiaoke/node:12.15.0 AS builder
2. WORKDIR /home/node/app                       # 创建工作目录
3. COPY package.json .yarnrc /home/node/app/    # 将package.json复制到工作目录 
4. RUN yarn install                             # 项目依赖安装
5. COPY . /home/node/app                        # 将项目文件复制到工作目录
6. RUN npm run build:dev                        # 项目开始编译 
flowchart 
  subgraph Jenkins[Jenkins Wokspace]
    subgraph compile[编译/打包机]
      f1(项目编译)
      preinstall(编译前置操作)
      f2(项目打包)
      output[/中间产物/]
      artifact(docker)
    end
    yarnrc> yarnrc]
    project[(project)]
  end
	
	yarnrc  --copy--> preinstall
	preinstall --> f1 --> output 
	output -->  f2
	f2	--> artifact
	project --copy--> f1

  classDef boxUi fill:#aef,stroke-dasharray: 4;
  class node_module,preinstall boxUi;
 

可以优化的点

  1. node版本不可选择,需要单独定制。
  2. 安装前需要把 yarnrc/npmrc 文件复制到工作目录。
  3. 依赖安装 node_module目录每次都要重新生成。

2. Node_module缓存到基础镜像

优点,固定版本每个编译依赖都是完全一致的。 缺点,更新比较麻烦 理想状态:用户无感知的使用上一次的node_modules

将编译优化方案

  1. 建立编译机器

  2. 使用编译机器,使用编译机器对项目代码进行编译

  3. node_modules: 编译机器==挂载本地工作目录==,安装时产生的node_modules会存在机器上

    在不修改package.json的情况下会==大大提高安装效率==。

  4. Output: 编译完成后,产出的产物也在本地工作目录。

  5. 产物打包,生成制品Docker

    1. 将当前工作目录下编译产出的Output目标复制到Docker内。

flowchart 
  subgraph Jenkins[Jenkins Wokspace]
    subgraph compile[编译机]
        	f1(项目编译)
       	preinstall(编译前置操作)
    end
    subgraph package[Docker打包]
        f2(项目打包)
        artifact(docker)
    end
    node_module[(node_module)]
    output[/中间产物/]
  end
	
	node_module  <--volume挂载到编译机---> compile
	preinstall --> f1 --> output 
	output --COPY-->  f2
	f2	--> artifact
  
   classDef boxUi fill:#aef,stroke-dasharray: 4;
   class node_module,preinstall boxUi;
 

上线流程

  1. 所有上线项目都要先经过Pre,然后现上线。
  2. 测试账号不应该直接部署生产环境的权限。