起因
最近公司项目发生了一起线上事故,最后排查下来是配置文件的问题。项目里application.yml文件内会用@build.time@记录打包时的时间,但是这个写法是build-helper-maven-plugin提供的(maven本身的写法有时差问题),但是用这种写法的话,项目运行时会报错,因为idea运行不经过maven打包的步骤。
公司内部一般是在@build.time@两边加引号来解决这个问题,提交的时候再去掉,但是提交时可能会忘记去掉,然后就造成了线上事故。
解决方法
可以使用git hooks提供的钩子在提交代码前检查是否有更改@build.time@,如果更改了就中止提交。
git hooks提供了很多钩子供开发者使用,具体的可以参考官网https://git-scm.com/docs/githooks,这里我们使用pre-commit钩子。做法如下:
首先,进入项目根目录下的.git/hooks文件夹下,在这个目录下可以看到很多的示例文件。
applypatch-msg.sample*
commit-msg.sample*
post-update.sample*
pre-applypatch.sample*
pre-commit.sample*
prepare-commit-msg.sample*
pre-push.sample*
pre-rebase.sample*
pre-receive.sample*
update.sample*
然后创建一个pre-commit文件,注意这里不要加后缀,在文件内填入以下内容:
#!/bin/bash
echo "code check running..."
for FILE in `git diff --name-only --cached`; do
grep -E \'@build.time@\'\|\"@build.time@\" $FILE 2>&1 >/dev/null
if [ $? -eq 0 ]; then
echo $FILE '修改了build-time,请调整后重新commit'
exit 1
fi
done
这端代码的流程就是先获取改动的文件,然后遍历文件内容,如果文件内查到了关键词,就中止提交并提示。
之后执行git commit前就会自动执行pre-commit内的命令,效果如下:
搞定!