Base
基础设施部分,项目发布在中国区亚马逊云,使用了AWS的容器服务(ECS)、容器注册表(ECR)、对象存储(S3)、弹性计算(EC2)
源码管理使用Atlassian出品的bitbucket,一款Git体系的代码仓库
CI/CD使用Jenkins与pipline实现与维护
项目开发语言为nodejs
项目代号salmon
项目打包&发布使用NPM&docker
一、标准的发布流程
- 开发工程师提交PR,审核通过,merge后触发Jenkins pipline执行job;
- Jenkins调度slave执行Jenkinsfile,各stage编排了一个job中的每个步骤;
- slave将源码拉取到workspace;
- 构建,读项目目录的dockerfile将源码打包成镜像;编译过程写在dockerfile中的npm install && npm build ;
- 发布,将编译/打包好的镜像推送到远端私有仓库(AWS-ECR);
- 部署,调用aws cli,更新AWS-ecs任务定义&服务,等待服务滚动发布
二、症结反馈
同事A:“目前自动化的CI/CD流程在线上环境比较缓慢,可能拖累开发测试工作,请寻找一些优化点”
同事B:“我的项目在本地打包只要一两分钟,但是线上构建流程要花10+分钟”
三、成因分析
查阅Jenkins Console Output && 分析Jenkin blue-ocean的时间统计,主要分为三个关键步骤:
stage{'Build'} 编译代码 // > 10min
stage{'Publish'} 推到仓库 // < 10s
stage{'Deploy'} 运行服务 // < 1min
随后继续分析“构建”这一步,时间消耗在docker build,进一步分析各个step,发现npm run build消耗了最多时间,约为9分钟
刚刚提到,我们线上发布流程是容器化的