Skip to content

你敢信,情人节当天,我跟运维在钉钉上聊到了晚上九点

事情是这样的,上周五情人节当天下午四点多,周会上项目经历突然说要转测,说周末老婆要生了,请了两周的产假,把原计划转测的提前了。因为就是修了几个bug,而且还不是前端的bug,我一开始还没当回事,心想这能有什么问题。结果领导的转测邮件发出去之前,自动化流水线上前端部分出错了,然后领导赶火车跑路了,让我什么时候解决完,把转测邮件发出去。

有句老话说 “你永远不知道明天和意外哪一个先来”,可是我现在知道了,是意外。我心里想,如果我有个 npy 就好了,然后就可以跟领导说,今晚我要陪 npy。可能领导有读心术,怕我晚上一个人孤单,在路上发消息给我说:“流水线上的事,我们公司统一由 PP 来负责,有什么事情你就问 PP”。PP 这个同事在公司的其他分公司上班,我之前见过两面,我非常委婉地形容他:嗯~,他是一个胖胖的小男生,其他的自己想象。我心想:好家伙,情人节整这出儿,这算什么事啊,我命由天不由我,千万不要啊啊啊,感觉把问题解决了吧,可是你越急,就越急,就越晚解决。

好了,我们来干正事儿,看看是啥问题,之前好好的,突然就不行啦。

流水线出错之后,我就立即去流水线上看构建流程和日志,发现是 npm install 的那一步了问题。我就立刻在本地运行了一下 npm install,但是 npm install的时候是正常的。然后我就把 node_modules 和一些 lock 文件删了,清理了一下 npm 的本地缓存,然后重新 npm install,结果还是正常的,就这样反反复复试了两三次之后,还是没问题啊,我就跟运维 PP 开始沟(甩)通(锅)之旅了。

我给 PP 发信息说:“我试了好几遍本地没问题,就流水线上有问题。”

PP 跟我说:“之前一直就没问题,就这次有问题,所以流水线没问题。”

我说:“那你的意思是说,这是我前端的问题咯?我跟你说,这次改的都是后端的代码,前端代码跟上次转测是一样的代码,所以我没问题”

PP 说:“那你在摸鱼咯?”

我说:“你你你,这是重点吗?肯定还是你流水线的问题。”

PP 说:“那你说,是什么问题?”

我一气之下,就气了一下,然后跟他说:“你可别跑了,我非找出来问题不可,我还是懂一些流水线的东西的。”

于是我恢复了一点理智,又去看了流水线报错的地方,去网上查看了一下错误信息,结果基本上都说是node版本的问题。我就网上拉了一下流水线设置 node 版本的语句,发现果然和我本地 node 版本不一样,我自己是 14.21.3,流水线上是 14.15.3,我喜出望外,立马跟 PP 说:“我知道啦,我知道啦,是 node 版本的问题,你把 node 版本升级一下改成14.21.3 保准行”。

PP 说他试一下,我静静地刷 B 站等候佳音(已经下班了)。结果没两分钟给我截了张图,华为云的流水线选node 版本是用下拉框 UI 控制的,只能选择已经有的,就跟我说换不了,只能后面跟华为的人说,让他们加,但是今晚情人节,况且已经下班了,应该不行。

我感觉脑子里有一万匹草泥马在奔腾,差点就撂挑子走人了。我冷静了一会儿之后,又发现了一丝丝的希望就是,华为云的下拉框里有15和16版本的 node,说不定能行。我直接用 nvm 换了 15 和 16 版本的 node,各自试了一下,都试过了,都报错,希望再次破灭。

这时候 PP 见我这么久都没有发信息就说:“听说,华为的人加班很多,你把问题用文字描述一下发给我,我跟人家客服反馈一下,万一人家回我们了,或者给我们解决方案了呢?”

事到如今也只能这么办了,我就又去翻流水线报错的记录,把错误信息截图了,然后用文字描述了一下,说明要新增的 node 的确切版本,发给了 PP。PP 回复说:“我这边反馈给华为那边,大概十分钟,没人回复就没戏了。”

就在等的过程中,我就又翻了一下流水线的日志,看了一下报错代码位置的调用栈,结果发现是一个叫 patch-package 的依赖用到了 一个 yaml 的包,就是这个包报错的,我就直接去 github 上找了这个库,翻了一下它的 issue,刚好有人提了 issue,刚好就是跟我一样的问题:

TODO 图片 就是说说 yaml 最近的一次的小版本更新从2.2.3 到 2.7.0,导致 npm install 的时候报错了,出现了不兼容的情况,请求修复。底下也有很多人回复,说可以通过 升级node的版本来解决,也作者回复说:2.7.0 不兼容 node 14.18 以下的版本,把node版本升级就可以了。

顿时感觉找到了方向,小火苗又死灰复燃了,我立马去扒 patch-package 项目的 package.json 文件,发现果然依赖的有 yaml: ^2.2.2。根据 package.json 文件的依赖安装规则,依赖的是 yaml: ^2.2.2,会安装最新的次版本,也就是 2.7.0,那么我就直接在本地 package.json 锁一下 yaml 的版本是2.2.2,然后执行 npm install,应该就行了。

我立马把本地的 node 版本切换到了 14.15.3,先不锁 yaml 版本,执行 npm install,不出意料报错了和流水线一样的错,翻了一下package-lock.json文件,yaml 安装的是2.7.0

错误信息如下:

看到这个错误,我也是第一次遇到,然后很自然地就去网上搜了一下,基本上都说是node地版本有些低了

Released under the ISC License.