在Git hook上配置Android Lint和Checkstyle

Enable git-hook

在project的.git/hooks的目录下,可以看到以.sample结尾的各种git hook shell文件,加.sample后缀的原因是让当前project的git hooks默认disable,如果去掉sample后缀,则对应的hook生效。比如去掉pre-commit.sample的后缀,则sample的pre-commit里面的内容就会在git commit之前执行,如果shell最后的?就不等于0),git commit就不会执行。

那么如何配置git-hook呢?

  • 方法一(推荐,自动配置):可以通过在Android里面添加task的dependsOn关系将,project中的hooks/pre-xxx拷贝到.git/hooks下:


    在Git hook上配置Android Lint和Checkstyle_第1张图片
    image.png

    因为不想针对单独的subproject的build.gradle进行配置,所以放在了rootProject下:


    在Git hook上配置Android Lint和Checkstyle_第2张图片
    image.png

    当然最前面还要apply下:apply from: "${rootProject.projectDir}/gradle/git-hooks.gradle",至于为什么在subproject的afterEvaluate做,是因为preBuild这些subProject的task是在subproject的evaluate后,才获取得到。当然也不能直接写preBuild dependson installGitHooks,preBuild应该是在java/android plugin中引入的(而这个一般在subproject中才apply)
  • 方法二:在git版本大于2.9的时候,在project的根目录新建一个hooks目录,专门用来放置git-hooks的文件,比如新添加一个pre-commit shell文件,内容是运行测试,如:./gradlew test。使用config配置的命令:git config core.hooksPath hooks,hooks是指向project新建的目录hooks。这时候运行git commit就会先去跑测试。
  • 方法三:使用symlink建一个软链接到默认的.git/hooks下,同样的在project新建一个hooks目录,下面放置pre-commit文件运行测试, 然后在.git/hooks目录下,将pre-commit.sample的后缀去掉,这时候没添加链接前,git commit会运行sample里面的内容,但是通过命名:ln -s -f ../../hooks/pre-commit .git/hooks/pre-commit,就可以找到project新建的hooks下自定义的pre-commit内容。
  • 方法四:通过使用git的tempalte directory,在clone和init的时候会进行默认的拷贝。具体实现大家可以下来动手尝试。
    好的,说完这样配置git-hooks之后,再看下这样配置checkstyle和Android lint

git-hook配置Android checkstyle

其实配置checkstyle很简单,因为如果checkstyle检查有issue时候,它的$?就是不等于0,成功则等于0,所以直接在pre-commit里面添加:

./gradlew ${project}:checkstyle
# 如果不想输出显示的话,运行
./gradlew ${project}:checkstyle >/dev/null

git-hook配置Android lint

配置Android的lint在我测试的project稍微麻烦下,因为被测的project,在运行lint的时候,总是被一些非lint的错误中断,所以在build.gradle中添加了以下配置:

lintOptions {
    abortOnError false
}

在配置了以下的选项后,表示即使在运行lint遇到错误也不中断。lint运行完成之后不管是否有issue,$?都是0(成功)。

所以暂时用shell去gou一把:

#!/bin/sh

red='\033[0;31m'
green='\033[0;32m'
noColor='\033[0m'

# for XXX and YYY
projectDir=$(git rev-parse --show-toplevel)
lintProjects=("XXX" "YYY")

for project in ${lintProjects[@]}
do
    # Android lint check
    echo "-----------------Starting run android lint for ${project}-----------------"
    lintReportPath="${project}/build/reports/lint-results.html"
   
    for issueCount in $(./gradlew ${project}:lint 2>/dev/null | grep "Ran lint on variant" | egrep -o '[0-9]+')
    do 
        if [ $issueCount -ne 0 ]
        then
            echo "${red}Failed, ${project} project has ${issueCount} lint issues!${noColor}"
            echo "Please refer file://${projectDir}/${lintReportPath}"
            exit 1
        fi
    done
    echo "${green}Successed, no android lint issues found for ${project}${noColor}\n"

    # Checkstyle
    echo "-----------------Starting run android checkstyle for ${project}-----------------"
    checkstylePath="${project}/build/reports/checkstyle/checkstyle.html"
    
    ./gradlew ${project}:checkstyle >/dev/null
    checkstyleStatus=$?
    if [ $checkstyleStatus -ne 0 ]
    then
        exit $checkstyleStatus
    fi
    echo "${green}Successed, no android checkstyle issues found for ${project}${noColor}\n\n"
done

好了,上面的配置就是Andorid lint和checkstyle如何加到git-hooks里面。
如果想了解如何在Android上配置lint和checkstyle,戳这里Android Lint & Checkstyle

你可能感兴趣的:(在Git hook上配置Android Lint和Checkstyle)