version 一查,谁也别想甩锅给我

0 阅读5分钟

我踩坑了:线上跑的到底是哪一版代码?

测试说我给的包有问题,还开会批斗我。我写了个插件,下次他们再说有问题,我直接拿出证据——这次是测试搞错了。


故事要从一次甩锅说起

去年有段时间,我们有个项目打给客户内网部署。
客户那边反馈说「有个功能不对」,售前拉了个群,问我们:现在他们内网跑的前端,到底是哪一版?

我懵了。

我能想到的只有:查 Jenkins 构建时间、看发版记录、让运维对一下包名……
但客户环境我们进不去,他们也不会给你看构建日志。
最后只能靠「大概是上周三那版」「你让那边清个缓存再试试」这种话术硬撑,沟通成本高到离谱,而且心里根本没底。

更绝的是后来有一次:测试同学部署错了包(把旧的打上去了),然后报 bug 说「前端有问题」。
我查了半天代码,逻辑没问题,就跟测试说:会不会是部署的包不对?
测试一口咬定:就是你给的包有问题。

我反复确认过发版记录、构建时间、包名,自己这边真的没弄错,但测试就是不信,坚持说是我的包有问题。
后来还专门开了个会,会上点名说「前端发的包有问题、导致测试环境异常」,我解释了半天「很可能是部署错了包」,没有证据,谁也说不清。
最后只能吃哑巴亏。
从那以后我就想:要是打开页面就能看到「这份代码是谁、什么时候打的」,下次谁再说是我的包有问题,我直接把证据拍桌上。


我试过的笨办法

一开始我试过在代码里手写版本号,比如在 main.js 里加一行:

window.version = 'v1.2.3';  // 每次发版自己改

结果要么忘改,要么改错分支,上线后发现 version 还是上一版的,等于白写。

也试过用 CI 环境变量在构建时注入,但有的项目没有 Jenkins、有的用别的 CI,配置不统一,换一个项目又得搞一遍,心累。

我就想:能不能在 Webpack 打包的时候,自动把 Git 分支、Commit、Tag、打包时间塞进代码里?
这样既不用记着改,也不依赖某一种 CI,只要是从 Git 打的包,就有「身份证」。


所以我自己写了一个插件

查了一圈,没找到特别合胃口的(要么依赖重,要么不能自定义格式),我就自己写了一个 Webpack 插件,名字叫 VersionRecord

做的事很简单:在打包时自动往你指定的入口文件里插一行代码,把版本信息挂到 window 上。
比如打包完之后,入口里会多出类似这样一行:

window.version = "master-a1b2c3d-v1.0.0-2026-01-15 10:30:00"
  • 分支名、Commit、Tag、打包时间都是从本地 Git 和构建时间自动取的,不用手写、不用记。
  • 上线以后,任何人打开页面,控制台输入 version 就能看到,售前、运维、测试都能自己确认。

接入插件之后,我们项目发版都会带上这段版本信息。
结果没过多久,测试又来找我:「你给的包有问题,功能不对。」

这次我没慌。
我让测试打开他们那边的页面,按 F12,控制台输入 version,把那一串发给我。
我这边一对比:Commit、打包时间、分支,和发版记录完全对得上——说明我给的包没问题,就是他们部署/环境搞错了。
我把截图和发版记录往群里一发:证据在这儿,这次真不是我的包有问题。
测试那边对了一下,确实是他们弄错了。

终于用证据说了一次话,不用再背锅。
我在自己项目里用了一段时间,内网对版本、和测试对「到底上的哪个包」再也没扯过皮,所以就整理了一下开源到 GitHub 了,仓库在这里:mczhaozl/VersionRecord(是我自己的 repo,欢迎 Star / Issue)。


怎么用(如果你也踩过同样的坑)

安装:

npm install version-record --save-dev

webpack.config.js 里配一下:

const CreateVersionRecord = require('version-record');

const VersionRecord = CreateVersionRecord({
  // 在哪个文件里注入(Vue 一般 main.js,React 可以选入口文件)
  isFileAdd: (fileName) => fileName.includes('main'),
  // 挂到 window 上的名字
  valueKey: 'version',
  // 版本串长什么样,自己拼
  getString: (branchName, commitId, tag, date) => {
    return `${branchName}-${commitId}-${tag}-${date}`;
  },
  // 哪些环境要注入:true 表示都注入,也可以只写 production
  checkEnvironment: true,
});

module.exports = {
  plugins: [new VersionRecord()],
};

打包一次,浏览器里输入 version 就能看到。
配置项不多,需要细调的话可以看仓库 README 里的表格(isFileAddvalueKeygetStringcheckEnvironment 都有说明)。

版本信息的来源就是本地 Git + 打包时间,大致是:

字段从哪来示例
branchNamegit branchmaster / feature/xxx
commitIdgit log -1a1b2c3d...
taggit tagv1.0.0
date打包时间2026-01-15 10:30:00

我自己的体会

  • 内网部署:再被问「现在跑的是哪一版」,直接让对方控制台看 version,省无数句话。
  • 人员变动:谁改过、改的是哪一版,用 Commit ID 反查 Git 就行,不用猜。
  • 测试/环境背锅:谁再说「你给的包有问题」,让他看 version,和发版记录一对——证据说话,不用再开会批斗还说不清。

如果你也遇到过「线上代码对不上号」的坑,可以试试这个插件,零侵入、改一下 Webpack 配置就能用。
仓库地址:github.com/mczhaozl/Ve… ,有问题或想法欢迎提 Issue,少踩坑才是真的。


如果这篇对你有帮助,欢迎点赞、收藏,或者分享给也被版本问题折磨过的同事。