很不凑巧,就在2016年最后一个工作日,我们公司发生了严重的线上生产事故。

安卓市场渠道管理的同事错将测试服的App上传到各个应用市场,部分用户更新了App,导致无法登录。

真是应了那句话,最终的错误都是由多个微小的错误累积造成的。如果当中某个环节的错误能及时发现并改正,那最后问题也就不会爆发了。

事情的经过

昨天根据产品的需求,Android发布了一个新的版本。正常开发、测试流程通过之后。我就打渠道包,发送邮件,通知其他同事。

在这之前,我在打包正式服版本的App时,并不会保留Debug版本。但是自从上次测试提出了“每发一个版本,都需要保留对应的Debug版本”这么一个需求后。我昨天就分别针对正式服和Debug两个版本都打了渠道包,分别存放在内部共享的RelaseApkDebugApk文件夹中。并且我在发送邮件中,明确指出:渠道包所在位置:xxx/ReleaseApk/2.1.2/。这就是导致线上事故的源头。

结果渠道管理的同事竟然没仔细看邮件,想当然得看到带有‘Apk’文件名就直接以为那就是正确的位置(职场中,详细查看邮件的内容,不要想当然地自以为是有多重要)。结果就把DebugApk中的渠道包上传到了应用市场。

由于上传到应用市场后,没有相关人员进行复查机制。导致了从昨天晚上到今天早上用户提出无法登录的问题这段时间,从技术到产品运营到客服等一系列人员中,都没有人发现这个严重的问题。直到一大早,用户在群里反馈:“登录显示密码错误;重设密码显示该手机号不存在”。what!密码错误也就算了,竟然说手机号码不存在,这很容易引起用户恐慌的。

一开始看到用户反馈,我还没有想到是apk版本的问题。只是单纯以为前端或者后端出现问题了。所以一大早到公司便开始进行问题排查(程序员工作的常态啊),通过问题复现,从前端排查到后端都没有发现问题。最后突然看到App首页显示的产品数据不对啊,怎么测试服的产品数据跑到正式服了,该不会是打包时正式服和测试服切换出错导致的吧。天啦噜,一想到这种情况,我有点慌了啊。如果真的是这个原因,那这个问题的全责就在于我了。不过幸好不是,之后证明我的打包是对的(那必须的呀!打包都是脚本自动打包。之前都是好的,我也没改动过,那程序自动跑的,出错的概率那是极低的),而问题出现在渠道上传的时候,误将Debug版本传到了应用市场导致的。

问题的解决

最后只能关掉测试服的部分服务,然后针对已升级错误版本的用户,在测试服中,增加了一条强制更新的记录。来强制这部分用户更新正确的App。最终,折腾了一上午的生产事故才算是解决了。

反思与总结

  • 在出错的所有因素当中,人永远是最容易出错的那一个环节。所以要想最小化因为人为因素所带来的风险,需要通过完善的流程来规避风险;
  • 每次出现的错误都暴露出了一个团队或者公司在流程管理上的缺陷与不足。唯有不断吸取教训,才能不断完善流程,降低出错的概率;
  • 出现问题后,立即解决问题是最重要的。越是紧急的情况,越考验一个人的解决问题能力以及应变能力。

最后,希望各位程序猿们同胞们能过个快乐的元旦,而不是在加班中度过!