记一次代码事故之后

2015-08-02 22:29:21 +08:00
 Elfe

写在前面:近来管理的事儿做得多了些,也就多了些时间去思考什么是公司的“工程师文化”。所谓文化,一定是整个公司都浸淫着的氛围,得靠点滴小事才能折射出来。所以就开始随手记一些工作中的小事儿,给自己一些答案,放在这里也能和大家多一些交流。


某下午,大家正各自忙活着,忽然传来一声吼:“都别pull代码哈,master上的代码不知被谁revert成两个月前的了!”(没错,就是百姓网网站的代码库)。立刻,锁部署系统(后来验证部署系统还是有足够防范不会把老代码直接发布的,但当时那个紧张呀),手工恢复代码库,几个人折腾了快一个小时,才安定下来开始找元凶:是一个实习生小朋友犯迷糊想pull却打成了push --force,指向主repo的master。

几个人坐下来讨论今后该如何防范类似问题。
取消实习生的master写权限?这会严重影响实习生和他mentor的生产效率,不可取;更何况,正式员工也会犯错呀,是不是他们也要根据资历分出个三六九等呢?
那就做更多的mentoring、教会了才给权限?可这次新人的mentor可是公司里最著名的布道github工作流程的人,真的全都教过、教会了,新人只是一时迷糊而已。

那怎么办?

最终的方案:
1. 取消所有人的baixing repo的写权限,只能在自己的repo上修改。
2. 所有工程师要merge代码时就向一个robot发送merge命令。robot会进行各种校验(merge命令发起方的身份、是否有PR、PR是否有reviewer给出LGTM、接下来还考虑加UT等等),成功后才会用robot的账号执行merge操作。
3. 由于同学们已经习惯了在github上review代码然后点merge按钮了,我们就写了小段油猴脚本,把github PR下面那个merge按钮变成了给robot发merge命令。

于是,除了需要设置一下油猴插件,之前的工作方式几乎没有任何改变,堪称完美!


一场虚惊后,我们的工作方式又进化了一步。我们一直都信奉breaking things and moving fast,有很多地方为了效率我们会采取一些(以我之前在微软时的标准来看)简单粗暴甚至危险的方式。随着公司的成长,我们要学着避免breaking things,但如何在避免它的同时又不影响moving fast,是一个很值得研究的话题。今后应该不断会有case扔出来和大家交流。


5.28携程事故,左耳朵耗子说了段话特别有道理,结合着咱们自己的事情回顾、自夸一下 :P

技术上出故障是必然的。能否体现一个公司是技术公司,重要看这几点:1)故障的恢复是否有技术含量,2)公司对故障的处理方式,如果是通过加更多的流程,或是通过加更多的权限管控,或是通过处罚犯错误的人,或是上升到员工意识形态上,而不是去用更好的技术来解决,那么这个公司不会是个技术公司。

13592 次点击
所在节点    程序员
82 条回复
skydiver
2015-08-03 00:50:36 +08:00
问题很常见,解决方法好奇葩。
直接在master分支上禁止force push不就可以了。
另外用油猴脚本来hack这方法也太不靠谱了。。检查可以在ci系统里做啊。github都有对应的api。
axb
2015-08-03 01:13:02 +08:00
类似的问题,我们用的是gitlab。

做法是修改了gitlab,区分merge和push权限,把所有人直接push master(包括-f)的权限取消,只能通过merge合并代码,并且做了类似Gerrit的权限控制,只有review之后的代码才能合并。
xi_lin
2015-08-03 01:22:21 +08:00
master分支禁止force push才是正道。。
clippit
2015-08-03 01:27:22 +08:00
油猴脚本这种方法感觉不好,要求客户端配置,流程不收敛,最好是在服务端配置好呢
Elfe
2015-08-03 07:30:40 +08:00
@humiaozuzu @ChiangDi 禁止 force push 是github enterprise才有的特性?我们使用的是普通的github org 有private repo的那种账户,在organization profile里没有找到admin tools哎。

搜到了这个 http://stackoverflow.com/questions/5094524/github-prevent-collaborators-from-using-push-f 今年6月8号github stuff的回复,disable force push还只是在wish list上……
Elfe
2015-08-03 07:38:11 +08:00
另外就是我们也考虑过webhooks,但似乎没能找到pre-push之类的event https://developer.github.com/webhooks/
holulu
2015-08-03 08:00:21 +08:00
难道 GitHub 上还没有分支保护功能?我看 coding.net 上有这个功能,启用之后可以指定哪些项目成员才能更新特定分支。
lujiajing1126
2015-08-03 08:38:57 +08:00
只允许fast forward不就好了?没必要搞这么复杂吧
sinux
2015-08-03 08:42:58 +08:00
我们连分支和git flow 都不能push到远程,开分支要申请......
humiaozuzu
2015-08-03 08:59:49 +08:00
@Elfe 这么大的企业为什么不自己 host 呢
blues9
2015-08-03 09:15:34 +08:00
用gerrit吧,安全可靠
robertlyc
2015-08-03 09:35:43 +08:00
现在的软文好可怕
realpg
2015-08-03 10:45:24 +08:00
我觉得楼主公司使用github的姿势不正确。

我没用过github的private服务,我还不知道他们的权限管理体系是啥样的。我这边正式项目用git的不多,如果用git,使用的是我曾经的一个git大牛同事自建的一套类似github的系统(PS 经过授权我可以带到别的公司去搭建使用),我们的套路是员工双账号,开发账号fork出来自己的库,只能发pull request,然后由另外一个任何有权做code review的人开浏览器隐身模式登陆有权限账号进行final code review,如果code review通过则merge进申请的分支。

就算你是CTO亲自写的代码,你也得经过别人的final code review才能进主库,任何时候包括线上紧急BUG修复也不允许自己写程序自己merge

自己merge是最大的大坑;任何人都会有一种自我感觉良好。
jiyee
2015-08-03 11:03:01 +08:00
好软文,能引起共鸣,又宣贯了价值观。
jiaozi
2015-08-03 11:07:28 +08:00
为什么感觉你们提交代码的流程都如此繁琐。。。难道因为我们用了比较low的svn。反正我们该提交提交,该合并合并的。至今还木有出现过事故。希望以后也不会。。。
wbsdty331
2015-08-03 11:19:59 +08:00
坐等“我就是那个用了push -force的员工”
w88975
2015-08-03 11:22:58 +08:00
我靠 master分支 实习生都能有权限?
我司的所有repo,都要管理员创建,fork出来已pull request的方式来提交,没出过事故.
w88975
2015-08-03 11:25:18 +08:00
某次发现主版本不小心给我赋予了权限,都吓的心惊胆跳的,马上找管理员给我取消掉,经常用cli,一不小心推送到origin分支就惨了...
Phariel
2015-08-03 11:35:28 +08:00
第一 大家都有master的操作权限简直就是作死 master仅限于代码层层通过pull request review才能被系统自动merge
第二 新人为什么要force操作 有人敢加force的一律拍死 (误
pyKun
2015-08-03 11:38:03 +08:00
楼主用下gerrit,git review的功能很合适。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/210303

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX