故事背景:
一个悠闲的下午,我正在喝着星巴克,看着掘金,突然收到了测试的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!这个功能就完成了。