记一次代码事故之后

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)公司对故障的处理方式,如果是通过加更多的流程,或是通过加更多的权限管控,或是通过处罚犯错误的人,或是上升到员工意识形态上,而不是去用更好的技术来解决,那么这个公司不会是个技术公司。

13597 次点击
所在节点    程序员
82 条回复
mozartgho
2015-08-04 12:06:46 +08:00
用SVN就好了,哪会有这些乱七八糟的问题。我们开发文档上定义了一套SVN的Best Practice,code review也很方便啊!觉得SVN完全满足我们的开发流程需求,git的优点还不足以让我们换掉SVN,就这些!
Elfe
2015-08-04 13:46:40 +08:00
@Livid 报bug:附言太长了发不了,里面的markdown没转换……问题本身倒不大,不过你好歹提醒一下么……
Livid
2015-08-04 13:51:26 +08:00
@Elfe 附言的 Markdown 转换功能今天会有,抱歉!
Livid
2015-08-04 13:51:57 +08:00
cc @Kai

一会测试。
Kai
2015-08-04 15:42:53 +08:00
@Livid 好的
Elfe
2015-08-04 16:36:39 +08:00
由上面gerrit+github的文章顺藤摸瓜找到cloudfoundry的实践 http://blog.cloudfoundry.org/2012/04/11/the-new-cloudfoundry-org-gerrit-jenkins-github/ 不过也是3年前的了。不清楚他们是自己搭的gerrit还是用的某public服务。

gerrit+github的服务我只找到GerritHub.io, 可是从他们的blog来看,似乎他们和github关系一点都不紧密,要用还是不太放心。 http://gitenterprise.me/2015/06/25/github-api-change-causes-problems-to-jenkins-and-gerrit/

有实践gerrit+github方案的同学么?传授一点经验? @mintist @clino @benjiam @yangshengwu @pyKun @hitmanx @oxoxoxox
pyKun
2015-08-04 16:40:24 +08:00
clino
2015-08-04 17:11:38 +08:00
@Elfe "gerrit+github方案"是什么意思啊?
我感觉有了gerrit就不需要github了哈
krafttuc
2015-08-04 17:53:00 +08:00
Elfe
2015-08-04 20:56:05 +08:00
@clino 因为我们目前全部都在github上,没有特别理由不想换啊

@pyKun @krafttuc 好,我去看看。多谢!
clino
2015-08-05 12:44:30 +08:00
@Elfe 那就gerrit可写,github对用户来说只读,gerrit相关分支push到github用工具自动进行
Livid
2015-08-10 08:51:25 +08:00
TopicSupplement 的 Markdown 支持已经部署。

谢谢 Elfe。
vibbow
2015-08-10 09:32:35 +08:00
https://pic.vsean.net/di/T3WI/QQ截图20150810023248.png
禁止force push不是应该是git服务器的必备功能么?
vibbow
2015-08-10 09:34:34 +08:00
fly2never
2015-08-10 10:08:23 +08:00
Atlassian Stash是一个不错的私有方案, 支持分支级的合并策略
tonitech
2015-08-10 12:23:05 +08:00
除了PM,其他人都没有权限像master分支push代码,实习生能做这种事说明你们没有做protect branch啊。
kisnows
2015-08-10 12:44:16 +08:00
我都没有权限忘master分支上push,都是push到一个新分支,然后给老大提和并请求。
否则估计我们公司也出问题了,因为手贱或者犯迷糊有的时候也会直接push到master上。还好reject了。
所以实习生还是不要给mater的写权限了
Anybfans
2015-08-10 13:01:14 +08:00
反正我们正式网站是Masterfen分支。
大家开发全是develop分支or 其他分支,
测试网也是develop分支,到时候发布大网
gDD
2015-08-10 13:22:50 +08:00
@fly2never
@tonitech
@kisnows 非企业版的 GitHub 是没有你们所述的功能的。。。
wych
2015-08-10 15:41:56 +08:00
还是权限放的太开了。
耗子的话有道理,但是前提是管理上有合适的流程啊,不能因噎废食。

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

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

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

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

© 2021 V2EX