生产环境炸了,我不得不去刨根问底
我他娘的真是服了。我们公司用的那个内部中间件,就叫“凪光”,这玩意儿版本号跟鬼打墙一样,三天两头变。之前一直跑得好好的,上周五下午三点半,电话突然就打爆了,生产环境那边直接给我报了一堆诡异的空指针异常。
我赶紧跑去看日志,心里骂娘。一看堆栈信息,就知道是“凪光”出了问题,一些核心的API调不通了。我把我们自己写的代码从头到尾扒了一遍,确定逻辑没问题。那就只能是那个中间件的版本又惹祸了。
我一把抓过旁边小李,问他是不是又动了什么手脚。小李一脸无辜,说他只是看文档里提了一嘴,说有个新特性在开发中,他手痒痒,就去GitLab上拉了个最新的开发分支跑了一下,他以为能提升点性能,结果把我们老项目的兼容性全毁了。问他拉的是哪个版本号?他支支吾吾,说他也不知道,就点了那个“最新提交”的按钮,直接拿下来了。
从GitLab到内部邮件,像个侦探一样追查
我当时真想拍死他。没辙,问题得解决。我只能自己上手去追查,到底哪个才是“凪光”的最新版本,而且还得是一个能用的版本。这活儿,比写代码难多了,跟搞侦探似的。
-
第一步:硬着头皮翻仓库。我直接登上了GitLab,找到“凪光”的那个烂摊子。好家伙,代码提交记录像瀑布一样往下流,光是最近一周的就有上百个提交。分支更是五花八门,什么feature/fix-bug-123,什么hotfix-pro-v3,连个正经的Release Tag都没有。我把最近的十几个提交记录一个个点开,想从提交信息里扒出点版本号的蛛丝马迹。
-
第二步:全是屁话。看了半小时,我气得想砸键盘。提交者根本不写版本号,净是“解决了那个问题”、“稍微优化了一下”这种废话。我根本搞不清楚哪个提交对应着哪个稳定版本。
我意识到,靠代码仓库是找不着了,他们的版本管理简直是灾难。我转头开始搜内部的邮件系统和技术论坛。
找到老王,他告诉我别信公开的版本号
在那个长满蜘蛛网的内部论坛里,我翻到了半年前的一个帖子。一个老员工抱怨“凪光”的版本混乱问题,下面有人回复了一个版本号:V3.1.4-Release。我心想这总该是个线索?我们现在跑的那个不稳定版本,肯定比V3.1.4新。
我立刻联系了以前负责这个中间件的架构师老王。老王现在调岗了,管着别的业务。我给他发了条微信,问他:“老王,现在‘凪光’的最新稳定版本到底是多少?是V3.1.4吗?”
老王回了个语音,带着一股无奈的笑意。他告诉我:“兄弟,别看文档,文档都是放屁。V3.1.4是半年前的项目,早就不维护了。现在那个小组的人,他们每天都在跑最新的,版本号压根儿就没对外公布。”
我追问:“那到底是多少?”
老王说,他们现在内部跑着一个V3.2.0-RC1的预发布版本,那是他们小组觉得最稳的,但是因为有几个接口还在变动,所以一直没敢正式发出来。老王给我偷偷发了个内部SVN的地址,说你直接拉这个SVN的HEAD版本,那个就是他们今天刚打出来的。
真相大白:所谓的最新版本,是今天早上打包的
我赶紧按照老王给的地址,把代码拉了下来。这一拉,我才真正明白了“凪光_最新_最新版本是多少”这句话的真谛。
代码里的版本注释清清楚楚写着:V3.2.0-RC1-SNAPSHOT-20240510-1030。
你看,连RC1都不是终点,后面还带着一个时间戳,精确到上午十点半。也就是说,所谓的最新版本,根本不是一个固定的数字,而是他们开发小组今天早上刚打包出来的那个东西!
我立刻编译,把我们项目里引用的依赖全部替换成了这个带时间戳的SNAPSHOT版本。然后我战战兢兢地在测试环境跑了一遍,所有的空指针异常,全他妈消失了。业务逻辑跑得比以前还顺滑,稳如老狗。
我赶紧把这个“今天早上十点半”的版本推到了生产环境。一晚上盯着监控,确定没问题,我才敢喘口气。
这回实践给我的教训是:以后追版本,特别是这种内部组件的版本,别信什么文档,别信什么Tag,更别信同事说他拉了“latest”。你得直接找到那个管事的人,问他今天早上或者昨天晚上,他手里刚热乎乎打包出来的那个东西,那才是你需要的“最新版本”。因为明天,这个版本号可能又变了。