2. 数据平台代码仓库分支策略设计与落地

数据平台代码仓库分支策略设计与落地 学习卡片

为什么数据平台需要统一分支模型

数据平台的代码资产类型差异很大:SQL 脚本、Python ETL、调度 DAG 配置、Schema/DDL 定义、元数据映射文件。它们的变更频率、影响范围和回滚代价各不相同,但共享同一套发布节奏。如果每种资产各自约定分支命名,合并时就会出现“SQL 已上线、调度配置还没合”的错位。统一分支模型的目标是:让所有资产在同一时间点拥有可追溯的版本快照,并让并行开发互不阻塞。

主干 / 发布 / 热修三层分支模型

推荐采用三层长期分支加两类短期分支的结构:

  • main(主干):始终对应“已通过 CI 但未发布”的集成状态,所有 feature 分支合并到此。
  • release/*(发布分支):从 main 切出,冻结后只接受缺陷修复,用于对应一次生产发布窗口。
  • hotfix/*(热修分支):从 release 或 main 切出,修复线上问题,修复后同时回合 main 与 release。
  • feature/*(特性分支):从 main 切出,承载单个需求或缺陷,生命周期短。
  • schema/*(Schema 变更分支):Schema 变更影响面大,单独走一条带额外审批的分支路径。
数据平台三层分支模型与合并路径 main release/1.4 切出 hotfix/1.4.1 回合 release 回合 main feature/* 切出 合并 schema/* 切出 合并 SQL 脚本 · Python ETL · 调度 DAG 配置 · Schema/DDL 定义 · 元数据映射

分支保护规则配置

分支模型只有配合保护规则才能落地。以下规则以 Git 平台通用能力为准,具体菜单名称可能因平台而异,但配置逻辑一致。

分支允许直接推送合并前要求审批人数特殊规则
main否CI 通过 + 至少 1 人审批1禁止 force push,禁止删除
release/*否CI 通过 + 至少 2 人审批2仅允许 hotfix 和缺陷修复合并
hotfix/*是(仅限指定人员)CI 通过1合并后自动触发回合 main 和 release
feature/*是无0合并到 main 时触发完整 CI
schema/*否CI 通过 + DBA 审批2必须附带回滚 DDL,禁止 DROP/TRUNCATE

多类型资产的合并冲突预防

SQL、Python、调度配置、Schema 定义在同一仓库中并行开发时,冲突主要来自三类场景:

  1. 同一 DAG 文件被多人修改:调度配置通常按 DAG 粒度组织,建议每个 DAG 文件只由对应负责人修改,feature 分支合并前先 rebase main。
  2. Schema 变更与 SQL 变更交叉:Schema 分支合并后,依赖该表的 SQL 分支必须 rebase 最新 main,否则 CI 中的方言校验会因字段缺失而失败。
  3. Python 依赖版本冲突:requirements 或 pyproject 文件变更走独立 PR,合并前由 CI 执行依赖解析检查。
落地建议:先用 CODEOWNERS 文件按目录指定负责人,例如 /dags/ @调度组、/schema/ @DBA、/etl/ @数据工程组。这样分支保护规则中的“审批人数”可以自动路由到正确的人,而不是随机等待。

验证分支模型是否生效

配置完成后,用以下检查项确认模型真正落地:

  • 尝试直接向 main 推送一个提交,应被拒绝。
  • 创建一个 feature 分支,修改一个 SQL 文件,发起合并请求,确认 CI 被触发且审批人被自动指定。
  • 创建一个 schema 分支,修改 DDL,确认 DBA 审批被要求且回滚 DDL 检查生效。
  • 模拟 hotfix 合并后,确认 main 和 release 分支都收到了回合提交。
常见误区:只建分支不配保护规则,等于没有分支模型。另一个误区是把 release 分支当成长期开发分支使用,导致发布窗口无法冻结。release 分支一旦切出,只接受缺陷修复,新功能必须回到 main 等待下一个发布窗口。