git下使用checkstyle构建代码风格检查

背景

出于团队协作开发的效率考虑,决定引入checksytle来规范代码风格.统一了风格,办起事来自然干净利落咯.

那引入之后有什么优点呢:

  1. 统一了代码风格,这样看起代码来不会觉得头疼.
  2. 能够矫正我们的撸代码规范,就跟那个坐姿优点类似...
  3. 能够检测代码垃圾,让代码编译更快,出问题的可能性大大降低.

有啥-缺点-呢:

  1. 每次提交代码,各种检测神烦,一个个调试,可能是一种煎熬吧.
  2. 调风格贼难受吧,选Google还是阿狸,以这两个为作为检测标准,估计你代码提都提不上去吧.

开始

接下来直接进入正题...
我们选择maven+git的套路来对代码进行检测.
大致原理:
git hook,来触发checkstyle的检测,其实现在也要不到maven.使用maven只是为了与jenkins做集成.就相当与设置两道关卡,即使你过了本地(防止有人偷渡..),还是过不了线上.

准备

我们要用到的东西有三个

  1. checkstyle-8.19-all.jar
  2. checkstyle.xml
  3. pre-commit

简单介绍下这几个文件的作用:

checkstyle.jar的作用就是java做检测代码,这个是基于源代码分析,跟findbugs不同是,findbugs是基于字节码进行分析.这就是检测java代码的工具.

checkstyle.xml这个就是规则(rule)的配置文件,基于xml格式.我们可以根据语法来设定我们自已想要的代码检测规则.

常见到语法配置如下:

http://checkstyle.sourceforge.net/config.html

几种常用到代码规约

  • 阿里巴巴检测规约
  • google checkstyle
  • sun checkstyle

pre-commit这个才是核心点,利用git的生命周期做hook,钩子触发.

在git提交的过程中,存在很多的生命周期,比如commit,pull,push,reset等等,每个动作都有对应的生命周期.
git也很人性化的为我们提供了一些回调的hook.每个git仓库下面默认都会有个.git文件夹,下面存放了很多关于git的配置信息.
在这里插入图片描述
分支,配置信息,日志信息,以及最重要的hooks,这个文件夹中就是专门存放钩子的.
在这里插入图片描述hooks文件夹中存放的都是以.sample结尾的一些hook样例.我们直接copy去掉.sample后缀就可以用了.

sudo mv pre-commit.sample pre-commit

当然这个文件就是一个脚本文件,支持很多的脚本语言,Python,prel,shell等等.默认是使用shell.因此在这个我们也使用shell.

处理的大致流程:
提交时,我们扫描所有的提交文件,过滤以.java为后缀的文件.然后使用工具进行分析,如果检测不通过,直接退出,不让通过pre-commit,类似拦截器功能.

脚本
#! /bin/bash
# @author:haloo#
#@func:pre-commit#
## cp ./checkstyle/pre-commit  ./.git/hooks/


print 避免NPE是程序员的基本修养
print 开始style checking

wd=`pwd`
print "当前工作目录:$wd"

# check-style版本号
check_style_version="checkstyle-8.19-all.jar"
check_style_xml_name="eec-checkstyle.xml"
check_jar_path="$wd/checkstyle/$check_style_version"
check_xml_path="$wd/checkstyle/$check_style_xml_name"

## 清空temp文件

rm -f temp

is_err=0
errorCount=0
warnCount=0

## 查找add到git 缓冲区中,以.java后缀的文件
for file in `git status --porcelain | sed s/^...// | grep '\.java$'`; do
    path="$wd/$file"
    print "检查文件: $path"
    re=`java -jar $check_jar_path -c $check_xml_path $path >> temp`
    warn=`cat temp | grep  "WARN"`

    if [[ $warn = *"WARN"* ]];then
        echo "{$warn}"
        ((warnCount++))
        is_err=1
     fi

     err=`cat temp | grep  "ERROR"`
     if [[ $err = *"ERROR"* ]];then
         echo "${err}"
         ((errorCount++))
         is_err=1
      fi
done


print "检查完成,祝你好运"

rm -f temp

if [ $is_err -ne  0 ];then
    print "出现了 $errorCount 个error"
    print "出现了 $warnCount 个warn"
    print "请先符合style才能提交"
    exit 1
fi
print "No Bug ,It is Good!!"
exit 0
脚本的存放位置

一般呢,我选择在项目根路径下,建立一个checksyle的文件夹,然后把上面的文件丢在里面.
git下使用checkstyle构建代码风格检查_第1张图片

注意:

使用第一步,需要将pre-commit拷贝到.git/hooks/目录下,这样才能正确执行.当然我们还要赋予这个文件可执行权限,不然是执行不成功滴.

sudo chmod +x pre-commit

tips
在多人协作的情况下:

由于checkStyle目录下的文件内容比较大,所以pull时可能会出现自动中断的现象.具体错误如下:

	RPC failed; curl 18 transfer closed with outstanding read data remaining
		The remote end hung up unexpectedly
		early EOF
		index-pack failed

解决方案:

  • 设置git的http.postBuffer
git config --global http.postBuffer 524288000

这个缓冲区主要是pull的请求缓冲区,设置大点就不会出现超时取消了.

  • 更改请求方式
    如果是第一次clone的话,可以选择ssh方式.

  • 终极大招
    直接手动下算了,别折腾了..

你可能感兴趣的:(杂七杂八)