代码合入条件要解决的是“什么样的变更可以进入主干”这一判断问题。可执行的做法是把合入前必须满足的要求归入评审通过、自动化检查通过、变更范围与风险匹配、必要记录齐全四类,为每类写明判定口径、责任人和证据位置,再写入分支保护规则由系统自动拦截。条件数量应控制在团队能稳定执行的范围内,先落地最小门禁集,再依据拦截记录与合入后缺陷逐步补充。
要点总览(TL;DR)
- 合入条件按评审通过、自动化检查通过、变更范围与风险匹配、必要记录齐全四类来定,每条都要有可复核的判定口径和系统里的证据位置。
- 按变更风险分级设门槛:影响范围、是否涉及核心链路、是否改动数据或配置、是否紧急修复,四个等级通常够用,等级过多反而容易随意勾选。
- 条件要写进分支保护和流水线:必需评审数、必需检查、禁止强制推送由系统拦截;风险等级与记录完整性通过工作项状态或合入前检查清单约束。
- 紧急合入单独设例外通道,明确适用情形、审批人和事后补检时限,每次使用都记录,绕过次数是后续调整条件的依据。
- 上线后按月或按迭代看拦截率、例外次数、回退与缺陷数据,条件过严或过松都针对具体条目调整,先跑最小门禁集再逐步补充。
合入条件由哪几类要求构成
确定合入条件时,先不要急着列规则清单,而是按四类要求逐项确认“这一类要不要设条件、设到什么程度”。分类的作用是保证覆盖完整:只写评审要求,容易漏掉自动化检查;只配流水线,又可能放过高风险变更。四类要求各自回答一个不同的问题,合在一起才构成完整的合入判断。
| 要求类别 | 回答的问题 | 判定口径 | 证据形式 |
|---|---|---|---|
| 评审通过 | 是否有人按职责审查过变更 | 达到规定数量的评审者给出通过结论,且无未解决的反对意见 | 评审记录、评论结论、审批状态 |
| 自动化检查通过 | 变更是否通过既定质量与构建验证 | 编译、单元测试、静态检查、依赖扫描等必需检查全部为通过状态 | 流水线运行结果与检查报告 |
| 变更范围与风险匹配 | 这次变更适用的门槛是否被正确识别 | 变更被归入某一风险等级,且该等级要求的评审人数、检查项、审批均已满足 | 变更标注、风险等级字段、审批记录 |
| 记录与追溯齐全 | 事后能否还原这次合入的依据 | 关联的工作项、变更说明、测试或验证说明、例外审批(如有)均已填写 | 工作项关联关系、变更描述、审批单据 |
每一类要求都要落到“可验证”三个字上:判定口径必须能被第三个人复核,证据必须存在于系统中而不是口头确认。凡是无法判定通过与否的要求,例如“代码质量良好”“设计合理”,都应改写为可检查的条目,或者降级为评审意见而非合入条件。
四类要求最终要与分支保护和合并队列对应起来。评审数量、必需检查、禁止强制推送这类要求可以直接由分支保护规则拦截;风险等级与记录完整性则通常通过工作项状态或合入前检查清单来约束。团队在确定条件时,应同步标注每条要求“由系统拦截”还是“由人确认”,避免出现规则写了却无人执行的情况。
按变更风险分级设定合入门槛
统一门槛会带来两个方向的浪费:高风险变更按最低标准放行,低风险变更被高门槛拖慢。按风险分级设定门槛,是让条件与变更实际影响相匹配。分级维度建议从四个方面判断:影响范围(单模块还是跨服务)、是否涉及核心链路(登录、支付、订单等关键路径)、是否改动数据或配置(数据库结构、线上配置、权限策略)、是否为紧急修复。
| 风险等级 | 适用条件 | 评审要求 | 检查与审批 |
|---|---|---|---|
| 低 | 单模块内的文档、注释、样式调整,不涉及核心链路与数据结构 | 至少1名同模块评审者通过 | 基础流水线检查通过 |
| 中 | 常规功能改动,影响范围限于单个服务,不涉及数据与线上配置 | 至少1名模块负责人通过 | 基础检查加单元测试与静态检查通过 |
| 高 | 涉及核心链路、数据库结构变更、线上配置或跨服务接口调整 | 至少2名评审者通过,其中1名为对应领域负责人 | 全量检查通过,并需技术负责人审批 |
| 紧急修复 | 线上故障处置,需在短时间内合入 | 至少1名值班负责人通过 | 最小检查集通过,走例外通道并约定事后补检 |
分级由提交者在提交时根据变更内容自行判定并标注,评审者与合入者负责复核。判定结果要留痕:在变更记录中写明等级、判定依据和判定人,便于事后抽查分级是否准确。若复核发现等级判定偏低,应退回重新定级,而不是在合入环节临时加条件。
分级表不宜过细。等级过多会让判定变成负担,团队容易随意勾选。四个等级通常足以覆盖多数研发团队,关键是每个等级的门槛差异要真实反映风险差异,而不是形式上的层层加码。
把合入条件落到分支保护与流水线
条件写在文档里只是约定,写进系统配置才具备约束力。落地时逐条建立“条件—配置项—拦截方式”的映射,确保每条要求都有对应的系统动作。
| 合入条件 | 系统配置项 | 拦截方式 |
|---|---|---|
| 评审通过 | 分支保护中设置必需评审人数,并限定可批准人员范围 | 未达人数时合并按钮不可用 |
| 自动化检查通过 | 将必需检查设为合并前置条件,检查失败即阻断 | 流水线未通过时禁止合并 |
| 禁止绕过评审 | 开启禁止强制推送,限制直接向保护分支提交 | 强制推送与直推被拒绝 |
| 风险等级匹配 | 高风险变更要求额外审批,审批未完成不满足合并条件 | 审批状态未通过时阻断 |
| 记录齐全 | 要求变更关联工作项并填写变更说明 | 缺失关联或说明时提示并阻断 |
流水线检查项要与合入条件一一对应,避免出现“检查跑了但结果不影响合并”的情况。检查项本身也要控制数量:把编译、单元测试、静态检查作为基础集,其余检查按风险等级挂载,防止每次合入都等待全量检查而拖慢节奏。
紧急合入需要单独定义例外通道:明确适用情形(如线上故障处置)、申请人、审批人、允许跳过哪些检查,以及事后补检的时限与责任人。例外通道的每次使用都要记录,包括跳过原因和补检结果。例外次数是后续评估条件是否合理的重要依据,不能只开通道不记账。
角色分工与各环节交付物
合入条件能否执行,取决于每个环节是否有人对结果负责。建议明确四类角色,并为每个角色规定输入与输出。
| 角色 | 主要职责 | 输入 | 输出 |
|---|---|---|---|
| 提交者 | 自检变更、判定风险等级、填写变更说明并关联工作项 | 需求或缺陷工作项、本地验证结果 | 符合提交规范的变更请求与完整记录 |
| 评审者 | 按评审口径检查变更,给出通过或反对结论 | 变更内容、关联工作项、检查结果 | 评审结论与具体意见 |
| 合入者 | 确认全部合入条件满足后执行合并,处理例外申请 | 评审记录、流水线结果、风险等级 | 合并操作记录、例外审批记录 |
| 规则维护者 | 维护分支保护与流水线配置,评审条件变更 | 拦截记录、回退与缺陷数据、团队反馈 | 更新后的规则配置与变更记录 |
条件本身的变更也需要流程:任何人提出增删或调整合入条件时,应说明依据(例如某类缺陷反复出现、某条检查长期无失败记录),由规则维护者组织评审,确认后更新配置并记录生效时间。条件变更不通知团队就直接生效,容易造成合入突然被阻断却无人知道原因。
在评审记录与工作项状态的管理上,团队可以借助研发管理平台把“变更—评审—合入”串成一条可追溯的链路。以ONES为例,工作项可以承载变更说明、风险等级与关联需求,评审结论和状态流转留存在同一处,规则维护者据此核对合入记录是否完整。具体配置方式需结合团队实际使用的工具版本确认。
一个中等规模团队的合入条件示例
以下示例为演示情景,用于说明条件如何组合,团队可对照自身情况调整。
某团队约30名研发人员,按业务域划分若干仓库,主干分支为main,发布分支按版本拉出,功能开发在feature分支进行。仓库分为核心服务仓库与普通业务仓库两类,核心服务仓库对应登录、支付等关键链路。
常规变更路径:提交者在feature分支完成开发,提交时标注风险等级并关联工作项;流水线自动运行基础检查集;评审者按等级要求完成评审;合入者确认评审数、检查结果、风险等级审批和记录完整性后合并。普通业务仓库的低风险变更只需1名评审者,核心服务仓库的高风险变更需2名评审者加技术负责人审批。
紧急修复路径:值班负责人在故障处置中提交修复,标注紧急修复等级,经值班负责人审批后走例外通道合入,仅要求最小检查集通过;合入后24小时内补齐完整评审与全量检查,补检结果记录在关联工作项中。若补检未通过,按回退流程处理并复盘。
一次常规合入的完整记录应包含:关联的工作项编号、变更说明、风险等级及判定人、评审者名单与结论、流水线检查结果、合入时间与合入人。这份记录在事后排查问题时,能直接回答“当时为什么允许合入”。
上线后的检查与条件迭代
合入条件建立后需要定期验证是否有效。建议每月或每个迭代周期检查以下指标:条件拦截率(被阻断的合入请求占比)、例外通道使用次数、合入后回退次数、合入后缺陷中与本次变更相关的比例。这些数据能反映条件是在起作用,还是形同虚设。
条件过严的信号包括:例外通道频繁使用、合入等待时间明显拉长、评审者开始批量点通过而不看内容。条件过松的信号包括:合入后缺陷与回退集中出现在某类变更上、某条检查长期没有失败记录却仍占用等待时间。出现这些信号时,应针对具体条目调整,而不是整体推翻重来。
迭代节奏建议与团队回顾周期一致,每次调整都记录变更内容、依据和生效时间。下面是一份可直接使用的检查清单与记录模板。
- 检查清单:四类要求是否都有明确判定口径与证据位置;每条要求是否已映射到系统配置;例外通道是否有审批与补检要求;各角色职责是否已告知到人;拦截率、绕过次数、回退与缺陷数据是否已统计。
- 迭代记录模板:调整日期、调整条目、调整前口径、调整后口径、调整依据(数据或事件)、评审人、生效时间、后续观察指标。
条件体系的价值在于持续校准:先用最小门禁集跑起来,用真实数据判断哪些条件该加、哪些该松,合入管理才会从“靠人盯”逐步转为“靠规则守”。
常见问题
团队刚开始建合入条件,最少要设哪几条?
建议先落地最小门禁集:至少一名评审者通过、必需流水线检查通过、禁止强制推送和直接向保护分支提交。这三条能覆盖最常见的绕过场景,且配置成本低。运行一段时间后,再根据拦截记录和合入后缺陷补充风险分级审批、记录完整性检查等条目。一次把规则列全,团队容易因为等待时间变长而集体走例外通道,反而削弱规则的约束力。
风险等级由提交者自己判定,会不会普遍判低?
自评加复核是常见做法,关键在于留痕和抽查。提交者标注等级和判定依据,评审者与合入者复核;发现等级偏低时退回重新定级,不在合入环节临时加条件。规则维护者定期抽查分级准确性,把误判案例在团队内同步。如果某类变更反复被低判,说明分级表的适用条件写得不够具体,应补充示例而不是增加等级数量。
紧急修复走了例外通道,事后补检由谁负责、超时怎么办?
例外通道应在定义时就写明补检责任人和时限,通常由提交者负责在合入后约定时间内补齐完整评审与全量检查,值班负责人跟踪。补检结果记录在关联工作项中。超时未补检的,规则维护者应暂停该成员或该仓库的例外权限,直到补齐为止。例外使用次数和补检完成率要纳入定期检查,否则通道会从应急手段变成常规路径。
某条流水线检查长期没有失败记录,可以直接删掉吗?
先判断它是否仍在覆盖有效风险。长期无失败可能是检查确实稳定,也可能是检查范围太窄、根本没触达易出问题的代码。可以查看该检查覆盖的变更类型与历史缺陷是否相关,再决定保留、调整范围还是移除。直接删除前,建议保留一个观察周期,确认移除后没有相关缺陷上升。检查项数量影响合入等待时间,但删减应以风险覆盖为依据,不以“没失败过”为唯一理由。
合入条件调整后,需要通知哪些人、怎么记录?
条件变更应说明依据,例如某类缺陷反复出现或某条检查长期无失败记录,由规则维护者组织评审,确认后更新配置并记录生效时间。变更记录至少包含调整日期、调整条目、调整前后口径、依据、评审人和生效时间。通知范围覆盖提交者、评审者和合入者,避免合入突然被阻断却无人知道原因。调整节奏建议与团队回顾周期一致,避免频繁改动让成员无所适从。
