谈 DevOps 平台落地:前端项目构建又失败了

image.png

同事发了一个前端构建失败的链接过来,接着就是那句:任务执行失败了,麻烦帮忙看看。

DevOps 平台的“老手”了,所以,在找我们解决问题时,都知道附上平台任务的链接。

我们打开链接,第一件事情就是看日志。是的,DevOps 平台的使用者很多都认为:在本地执行构建成功,那么在平台上构建失败就是平台的问题。所以部分人连构建日志都不看,直接把链接发给我们这些平台维护者看。

不出意外,这次又是依赖管理问题。只不过,这次是发生在前端项目上。错误截图下如下:

image.png

日志里(画红线部分)已经说得很清楚了。虽然我不清楚“Tristan”是什么,但是可以猜到是他的业务代码报这样的错。但是他本地执行没报错,那通常就是依赖的版本的问题了。

他的前端的依赖定义(package.json)类似以下这样:

{
.....
  "dependencies": {
    "cookie-parser": "^1.4.3",
    "debug": "~2.6.9",
    "express": "^4.16.0",
    "http-errors": "^1.6.2",
    "morgan": "~1.9.0",
    "pug": "2.0.0-beta11"
  },
...
}

我们看到依赖的版本号的前缀有 ~,有也 ^。这是什么意思呢?

  • ~: 前缀表示,安装大于指定的这个版本,并且匹配到 x.y.z 中 z 最新的版本。
  • ^: 前缀在 ^0.y.z 时的表现和 ~0.y.z 是一样的,然而 ^1.y.z 的时候,就会 匹配到 y 和 z 都是最新的版本。

也就是说,每次执行 npm install ,该项目所依赖的内容,都是有可能变的。

这对我来说是不可思议的。为什么?

因为依赖的版本代表着一个软件的基础。依赖的版本在你不知道的情况下发生变更,就好比建房子,建第一层时,地基是100个平方,建第二层时,地基突然就变成了90个平方。而前端项目中大量这种情况。

你可能会说开源前端node项目都会遵循语义化的版本号,小版本升级不会出问题的。我想说,那只是约定,还是要看那个人遵守不遵守。如果你真相信每个人都遵守,本质上是把软件开发风险的控制权交给了开源软件作者的个人习惯。开发出来的软件注定是不稳定的。

但是,为什么前端项目的依赖的版本号前普遍会加上 ~^ 。在我亲自执行 npm install express 命令时,我知道了原因。因为在执行命令后, package.json 文件中就出现了:"express": "^4.16.0"。也是 npm 在安装依赖时,默认就给版本号加上 ^ 前缀。而很多人可能改都不会去改。这就导致了文章开头所说的那位同事的问题。

后记

真心希望大家固定下 package.json 中的依赖的版本号。这样的前端项目构建起来才有稳定的基础。

同时,我们的 DevOps 平台在设计时,是不是可以考虑增加这么一个功能:自动检测项目有没有固定依赖的版本号,如果没有固定,就告警。

我把这个功能叫做:依赖版本号不稳定预警。


Last modified on 2019-11-20

- CATALOG -