Enable git-hook
在project的.git/hooks的目錄下远豺,可以看到以.sample結(jié)尾的各種git hook shell文件肩祥,加.sample后綴的原因是讓當(dāng)前project的git hooks默認(rèn)disable,如果去掉sample后綴砚哆,則對應(yīng)的hook生效独撇。比如去掉pre-commit.sample的后綴,則sample的pre-commit里面的內(nèi)容就會在git commit之前執(zhí)行躁锁,如果shell最后的?就不等于0)搜立,git commit就不會執(zhí)行。
那么如何配置git-hook呢槐秧?
-
方法一(推薦啄踊,自動配置):可以通過在Android里面添加task的dependsOn關(guān)系將忧设,project中的hooks/pre-xxx拷貝到.git/hooks下:
因為不想針對單獨的subproject的build.gradle進(jìn)行配置,所以放在了rootProject下:
當(dāng)然最前面還要apply下:apply from: "${rootProject.projectDir}/gradle/git-hooks.gradle"颠通,至于為什么在subproject的afterEvaluate做址晕,是因為preBuild這些subProject的task是在subproject的evaluate后,才獲取得到顿锰。當(dāng)然也不能直接寫preBuild dependson installGitHooks谨垃,preBuild應(yīng)該是在java/android plugin中引入的(而這個一般在subproject中才apply) - 方法二:在git版本大于2.9的時候,在project的根目錄新建一個hooks目錄硼控,專門用來放置git-hooks的文件乘客,比如新添加一個pre-commit shell文件,內(nèi)容是運行測試淀歇,如:./gradlew test。使用config配置的命令:git config core.hooksPath hooks匈织,hooks是指向project新建的目錄hooks浪默。這時候運行g(shù)it commit就會先去跑測試。
- 方法三:使用symlink建一個軟鏈接到默認(rèn)的.git/hooks下缀匕,同樣的在project新建一個hooks目錄纳决,下面放置pre-commit文件運行測試, 然后在.git/hooks目錄下乡小,將pre-commit.sample的后綴去掉阔加,這時候沒添加鏈接前,git commit會運行sample里面的內(nèi)容满钟,但是通過命名:ln -s -f ../../hooks/pre-commit .git/hooks/pre-commit胜榔,就可以找到project新建的hooks下自定義的pre-commit內(nèi)容。
- 方法四:通過使用git的tempalte directory湃番,在clone和init的時候會進(jìn)行默認(rèn)的拷貝夭织。具體實現(xiàn)大家可以下來動手嘗試。
好的吠撮,說完這樣配置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,在運行l(wèi)int的時候削彬,總是被一些非lint的錯誤中斷担孔,所以在build.gradle中添加了以下配置:
lintOptions {
abortOnError false
}
在配置了以下的選項后江锨,表示即使在運行l(wèi)int遇到錯誤也不中斷。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