神马?!每次都忘记手动改版本号该怎么办!

348 阅读2分钟

故事背景:

一个悠闲的下午,我正在喝着星巴克,看着掘金,突然收到了测试的message。

测试:你的代码发到测试崩溃了呀!

我:神马?不可能!我的代码0bug!

测试: 你自己看, 懂得都懂。

于是开始疯狂的定位中。。。

浏览器无报错,只是提示js包丢失,于是我意识到不是由于语法错误导致的崩溃,猛然间我想到了我们的部署机制,是通过版本镜像部署CDN,也就是说镜像包是通过版本号区分的,所以如果没有手动更改一次版本号就部署流水线的话,那一定是凉凉的。

于是我想起了来自大佬的问候:

那么问题来了,像我们这种不拘小节的程序员来说,十次有九次想不起来,那要如何是好?

尝试: 扩展commit-lint 每次commit时都去做差异化版本检测,并进行提醒

有了诉求,其实功能也就出来了。

首先我们需要一个检测的脚本:

const { execSync } = require('child_process');
const chalk = require('chalk');
const packageJSON = require('../package.json');
const semver = require('semver');
const start = async () => {
  console.log('============ 正在检查版本号 ============');
  try {
    // diff中的master变更筛选规则
    const partten = `"version": "`;
    // 获取diff文本
    const diff = execSync('git diff master package.json', {      encoding: 'utf8',    });
    // 小于0 则代表version未变更
    const firstDiffIndex = diff.indexOf(partten);
    if (firstDiffIndex < 0) {
      throw '版本未变更!请修改版本号后再commit';
    }
    const masterDiffIndex = diff.indexOf(partten);
    const masterVersion = diff.substring(      masterDiffIndex + 12,      masterDiffIndex + 17    );
    const versionPass = semver.lt(masterVersion, packageJSON.version);
    if (!versionPass) {
      throw `当前版本号(${packageJSON.version})低于master版本(${masterVersion}),请修改版本号后再commit`;
    }
    console.log(chalk.keyword('green')(`当前版本号${packageJSON.version}通过`));
  }
 catch (error) {
    console.error(chalk.keyword('orange')(error));
    // 退出进程,不再commit文件
    process.exit(1);
  }};
start();

其次在package.json 增加precommit:

    "scripts": {
        "precommit": "lint-staged && node scripts/versionlint.js"
    },
    "husky": {
        "hooks": {
            "pre-commit": "lint-staged"
        }
    },
      "lint-staged": {
        "**/*.{ts,tsx}": "tslint",
        "**/*.{js,jsx}": "eslint"
    },

Done!这个功能就完成了。

效果如下