git commit 关联icafe
到 git push之后触发的:安全检查、格式校验、合入冲突等;
agile的发布分支
orp的上线

整个上线大概会用到3个平台: icode\agile\orp
如果要做一个 icafe关联后 直接一键发布的 上线平台,需要解决的问题:
如果做一个上线平台,需要走的步骤:
静态资源部署、预览机、单台、单边、全量(灰度发布又是啥?)
快速回滚的方案

参考资料:百度鳗鱼-如何从 0 到 1 打造团队 PC/H5 构建工具

CI/CD释义

image.png

CI(Continuous Integration)简称持续集成,原意是各个开发者在开发过程中,需要将代码集合到一起,比如我们的 GitLab,GitHub 等。现在大多会包含集成之后,自动触发编译,测试等过程,帮助开发者及时收集问题。

CD(Continuous Delivery)指的是> 持续交付和> 持续部署,经过 CI 后,代码自动部署到服务器上的一个过程

  • 代码托管:我们有 GitHub/GitLab/还有国内的码云,Coding 之类的平台;
  • 构建:对于 Java 有 Maven,对于前端是 npm;
  • 集成:有 Jenkins,Travis,测试对于前端是 Mocha/Jest 之类的工具;
  • 部署:物理机/虚拟机/Docker K8s 等等

image.png

git hook

git commit 钩子

  • precommit: 提交前进行代码检查,如eslint;触发自动化测试(mocha):husky工具
  • pre-receive: 准入之前的校验:复用率检查、安全扫描等

image.png
合入代码后,进行打包构建:npm run build
编译:babel转换、ts解析、icon处理生成iconfont、代码合并压缩、静态变量替换
CI 的一个核心点,是自动化,就是在代码提交之后能自动去运行打包的脚本,而不是我在本地打包之后一起提交带代码库里面。工具:Travis CI

构建image.png

流程:
image.png

image.png

深入下去可以细究的点:
git hook:

  • Git hook 触发方式:自动/定时/其他流水线关联触发

    代码提交了之后是自动触发的,那怎么去做到定时触发,怎么去在一个代码库编译完了之后,通知另外一个代码库去做编译。

  • 监听分支:怎么匹配?(精确/前缀/正则/排除)

    还有分支,有时候我们只想 dev 分支去做自动编译,master 分支需要有特殊控制,怎么去更好的监听分支的变化

  • 使用那些钩子去做检查

构建:

  • 环境变量有哪些,不同流程如何传递

    环境变量有哪些,不同流程之间怎么做到一些通用变量共享

  • 需要哪些环境,怎么切换

    有哪些环境,比如说 node8,node10,怎么去特定换定编译,怎么切换

  • 并行&串行

    怎么去做并行编译

  • 机器对编译产出怎么存的,过期时间?

  • 异常处理,超时机制
  • 是否要在编译前做代码的各自检查,成功后才编译

发布策略

way1:蓝绿部署

指我们同时运行两个版本的应用,蓝绿部署的时候,并不停止掉老版本,而是直接部署一套新版本,等新版本运行起来后,再将流量切换到新版本上

image.png
way2:滚动发布
image.png

way3:灰度发布
image.png

部署-前端资源替换方式

当我们拿到了产出,怎么把产出给弄到不同的环境,怎么优雅的上线
本质是丢资源,http ftp等

image.png

有个亮点:
common文件可以放在cdn,动态链接的方式,就能解决common发布之后其他仓库无需发布上线的需求。
但新的问题是:cdn的缓存如何解决?
===> 上图提供了解决方案: 多一层 Nginx 去控制资源的版本切换,(如 默认使用lastest
是不是我们的 common 有救了??
验证:
可以在自己的otp机器上 的Nginx修改,
然后 修改common,手动部署到机器上
不修改fe-pc-ucenter,但此时pc-ucenter里依赖的common的资源就是最新的了

验证步骤:
1、pc-ucente依赖的common资源确定 收敛范围
2、将确定的依赖的 common资源,改写为js的方式,转存的cdn
3、增加BFF层(如nginx)转发 bos里common的请求,每次拿最新的给前端
4、修改common,部署发布 增加一步:打包资源推送到cdn
5、访问ucenter,验证common的是否更改 (如 弹窗 or log加个拦截之类的)

image.png
image.png

部署的思考点:

  • 如何指定部署某个环境(dev?prod?
  • 怎么做权限控制
  • 成功通知、失败回滚通知
  • 怎么打版本号
  • sourcemap怎么存,怎么关联
  • 日志的上报存储分析
  • 物理机/docker的分别部署方式

还有:

  • 代码跟需求卡片关联
  • 自动提测(根据当前commit生成提测邮件并部署到测试环境)
  • 各种服务端的检查,各种测试,审批等等