首页 / 业界 / 正文

踩过坑才懂DevOps流水线中的质量门禁怎么落地

上周跟南京河西做SaaS的运维老陈吃饭,他吐槽上周刚回滚了支付模块的版本。原因很简单,为了赶季度的客户交付节点,团队集体把代码扫描的严重漏洞阈值从1个调到了5个,觉得“哪有那么巧”。结果上线第三天,外部安全平台扫到代码里硬编码了测试环境的数据库密钥,差点被人拖走客户的订单数据。擦屁股擦了整整两天,他说现在想起那事还后背发凉。

很多人把质量门禁当拦路虎

这话真不是我夸张。跑过十几个南京本地的技术团队,十个有八个对流水线里的门禁有抵触。

赶版本要加班的时候,第一个想关的就是门禁。代码提交了,扫出两个严重漏洞,开发说“这是内部接口,外人碰不到”,测试说“这个问题之前就有,不急”,运维没办法,只能临时把阈值调松,让代码过。

更离谱的是之前碰到的一个团队,为了满足门禁里80%的单元测试覆盖率要求,开发专门写了一堆全是断言true的无效用例,凑数凑到82%。等真上线跑业务,核心的订单计算逻辑错了三个分支,用户下单金额算错,赔了小几万的优惠券。

DevOps流水线质量门禁配置界面截图

说白了,大家对门禁的反感,本质上是把它当成了流程上的“卡壳环节”,觉得本来就能快速上线的东西,非要被这个规则拦着耽误时间。没人仔细想,DevOps流水线中的质量门禁从来不是为了给开发添堵,而是把本来要在上线后才暴露的问题,提前堵在代码提交的环节。

阈值不是越高越靠谱

很多团队踩的另一个坑,是把门禁的阈值设得越高越好。

之前有个做本地生活服务的团队,刚上DevOps流水线的时候,抄了大厂的全套门禁规则:代码注释率不低于30%,单元测试覆盖率不低于90%,代码重复率不能超过3%,甚至连变量名长度都有要求。

结果呢?

开发天天为了凑规则改代码,本来一天能写完的业务功能,要花两天时间调整注释、补无效测试、把重复的代码拆成碎函数。迭代速度直接掉了一半。

没人受得了。

最后团队直接把门禁全关了,回到原来的人工测试、人工上线的模式,之前搭流水线花的几十万,全打了水漂。

麻烦在于,门禁的阈值从来不是静态的。不同阶段的风险等级不一样,用同一套规则卡所有环节,本来就是错的。

比如开发在本地调试写的临时分支,根本不需要卡太严,只要能跑通基本的语法检查就行,不然连提交的动力都没有。代码合并到主干的环节,再卡严重安全漏洞、核心模块的单元测试覆盖率。走到预发布环境,再加性能压测、全量安全扫描的规则。

DevOps流水线分阶段质量门禁规则示意图
DevOps流水线分阶段质量门禁规则示意图

好的质量门禁是跟着迭代节奏动态调整的防线,不是钉死在墙上的规章制度。大促前的迭代窗口可以适当放宽非核心模块的门禁规则,常规迭代期就把阈值收紧,这才是真的为了效率考虑,不是瞎搞。

别让门禁变成没人看的摆设

别让门禁变成没人看的摆设
别让门禁变成没人看的摆设

还有个最容易被忽略的细节,门禁的告警信息,到底推给谁看?

我见过太多团队,配完门禁规则就不管了。流水线跑出来的门禁报告,存在平台的后台里,没人主动去看。等代码走到上线环节,才发现因为门禁不通过,根本没法部署,整个团队拉会排查,半小时才找到问题是三个月前配的一个规则卡了新的业务代码。

没用的。

后来跟那个做SaaS的老陈聊调整方案,他们把所有门禁的告警,直接推到对应提交代码的开发的企业微信上,告警里直接附带着报错的具体行号、问题类型、甚至直接给了修复的参考链接。比如扫到硬编码的密钥,直接跳转到密钥管理平台的配置页面,开发改完提交,流水线自动重新跑检查。

调整了不到一个月,老陈说现在很少出现上线前才发现门禁报错的情况了。开发提交完代码,等个两三分钟,看到门禁过了就去忙别的,没过的话顺手就改了,根本不用测试和运维追着要修复。

DevOps流水线门禁告警推送流程示意图
DevOps流水线门禁告警推送流程示意图

说真的,很多人觉得质量门禁是运维或者测试团队的事,跟开发没关系。大错特错。门禁的规则如果没有开发的参与,全是测试或者运维拍脑袋定的,最后肯定会变成大家想绕开的摆设。比如之前有个团队的门禁规则要求代码的方法长度不能超过50行,结果开发为了过规则,把一个本来逻辑连贯的方法拆成了十几个小函数,读代码的人找半天才能理清楚逻辑,反而增加了维护成本。

上周老陈跟我说,现在他们的季度交付节点再也不用临时调门禁阈值了。毕竟谁都不想再体验一次上线后半夜被叫起来回滚的滋味。