有很多同学都问过我,每次上线时前端打tag是在干嘛?
现在教育产品部的前端组有着上百个公共组件、模块,被大约6条业务线、共十几个工程使用。这些公共组件、模块并不是一成不变的,它们的代码、彼此间的依赖关系在每个业务线的迭代中都发生着变化。必须要有一个方案,来保证:
其他业务线迭代上线后,自己业务线的线上代码不被影响。因为发生变化的代码意味着不可预测的风险,必须要经过测试验证才能让他们背锅
因此,tag机制应运而生。
Git 可以对版本库打上标签,形成快照,将来无论什么时候,取某个标签的版本,就可以把打那个标签的时刻的历史版本取出来。对某个时刻打TAG,实际上是对该时刻最新的一次commit提交打上标签,因此TAG就是指向某个 commit 的指针,跟分支很像但是它是不可变的分支。
每个后端同学都经历等待bower update执行的漫漫漫长时间吧。bower是前端的一个包管理工具,可以通过指定包的版本、分支来使用对应的代码。
EDU组件池的每个组件、模块都有一个自己的GIT工程,结合tag和bower,管理它们就变得简单起来了。
先来设想下,如果只有一个组件,各个业务线之间时怎样协作管理它的呢。
当存在多个组件、且组件之间互相依赖时,协作管理就变得稍微复杂了一些。 大图请戳
整个开发过程中,组件池的主要操作流程在组件池工具的readme中已经写的非常详细。总的来说,在上线前更新组件的版本号并在业务线工程中指定版本号的过程就叫做打tag
注意事项:
hotfix流程总结如下,假设组件1存在bug需要fix:
git checkout v0.1.0
,git branch hotfix/xxx
如果组件2依赖了组件1,此时bower update会发生冲突,因为组件2此时使用的时组件1的0.1.0的版本号。需要在resolution中指定组件1使用#hotfix/xxx分支(除了这种情况,业务工程里不应该有任何resolution)
在开发流程中,鉴于组件池已经有上百个组件,拉分支、合并代码、打TAG都通过自动化工具来进行。注意事项如下:
合并代码
"merge:master": "node command/merge.js -f master -m"
"merge:compx": "node command/merge.js -c"
,迭代合并分支时使用merge:compx
,这个命令没有使用-m
参数,不会自动解决bower.json冲突,运行的时候记得手动加一下。业务线组件池
组件池中的组件包括公共组件和各个业务线的私有组件: 假设公共组件A、K12私有组件B都引用了公共组件C,某次云课堂的上线,更新了组件C,打tag的时候会更新公共组件A的小版本,并把它依赖列表中的C的版本号更新。但是因为组件B是K12私有组件,对云课堂不可见,此时B的依赖还是旧版本的C。当K12的业务工程同时依赖了A和B的时候,它们所需要的C的版本号不同,则会发生冲突。这种情况只会在打完TAG以后才会发现,需要在TAG上手动更新下组件B对组件C的依赖。
本文来自网易实践者社区,经作者曹阳授权发布。