版本管理解毒

373 阅读4分钟

场景

   近期工作中,遇到了一些在项目版本管理上的问题。由于客户要求,在整个项目的开发中,项目需要频繁的交付部署,这其中涵盖Bug 修复及新的 Feature 开发

   我们拥有一套针对该项目的 CI/CD 环境资源,在一段时间开发后,我们发现时常会在部署 Bug 修复的时候,误带入了新的 Feature,或是在部署 Feature 的时候带入了别的还无需交付的 Feature,整个分支管理和版本管理都处于一种比较混乱的状态,这对于交付质量和开发体验都有很严重的负面影响。

   通过分析我们项目现状以及可支配资源,给出了以下的建设性版本管理方案,以提高我们的版本管理效率,使工程结构清晰,增强可维护能力。

痛点

  1. 在项目开发中存在庞大的修改 Bug 的工作,如何更好的管理 Bug 版本?
  2. 项目中存在多个新功能需要开发,如何保证新功能不在错误的时间点提交?
  3. 如何便捷的做项目间的Bug 修复合并
  4. 如何便捷的做项目间的Feature 合并

版本控制模型

基础结构

   由于目前阶段修改 Bug 的工作量巨大,占据总工作量近乎一半。考虑到我们支持持续集成及容器化部署,因此可虑阶段性的启用两套 CI 环境。 在此基础上,我们设定两条主分支,针对 Bug 和 Feature 进行分离的版本管理,使二者无交叉,仅在重要结点进行合并,从而保证版本的清晰与交付的准确。

业务背景

  1. 我们的项目都起源于同一个基础版工程 —— dev。
  2. oem-dev 和 oem-develop 为不同的两个项目。

版本管理流程

image.png

  1. hotfix-ci-release 作为 bugfix 主分支,也是稳定的落地交付出包分支,运维每次仅需取用最新版本 docker image 进行部署, 该分支也作为测试验证 bug 的分支。

  2. feature-ci-relese 作为 feature 的迭代的主分支, 每个独立的 feature 在完成提测时都将被合并到这个分支,以便测试进行验证。

  3. 修复完成后的 bug 可以在合适的节点合并到 feature 分支

  4. 新的 feature 在需要部署时合并到出包分支进行最终出包。

团队约定

  1. 申请两套完整的 ci 系统,一套用于单纯的 bugfix,bug 测试及落地环境部署出包,一套用于新 feature 开发与测试。

  2. 每个 commit 必须对应且仅对应一个 jira 版本号,以确保版本回溯和 commit 合并更加方便和精准。

  3. 同一项目中采用一致标准的分支命名规范。

     a. 【name】-hotfix-release      hotfix-release 分支  
     
     b. 【name】-feature-release      feature-release 分支  
     
     c. 【name】/ fix-【jira id】      临时 fix 分支  
     
     d. 【name】/ feat-_【feature name】       独立功能开发分支  
     
     e. 【name】/【personId】       个人分支  
     
     f. 【name】/ merge-【jira id】      临时 merge 分支  
     
     g. 【name】/ feat-【feature name】-fix       feature bugfix 分支
    
  4. 不同项目可采取不同分支管理或分仓库管理。

     分支管理:
         a. 切换项目简单
         b. 合并简单
         c. 分支数量较多
     分仓库管理:
         a. 项目独立
         b. 分支清晰
         c. 合并较复杂
    

结语

   选择通过 branch 的合理规划,来解决版本的冲突与可能产生的矛盾。不采取以 git tag 为核心来做版本规划,是因为 tag 的可读性不够高,附带信息也不够丰富,检索效率也比较低。在重点节点上,我们依然可以标记 tag 来进行标注。

   一个 commit 唯一对应一个 jira 版本,坚持这一点可以让我们后续的问题追溯及项目合并变得十分轻松。

   上述所规划的版本管理模型适用性并不够高,不一定能适用其他场景,但重要的是提供一种设计思路,bug 和 feature 是我们日常工作中需要处理的两种主要类型事物,通过清晰的区分二者,来让我们的版本管理变得更加清晰和容易上手。