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下:
因为不想针对单独的subproject的build.gradle进行配置,所以放在了rootProject下:
当然最前面还要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