在Git hook上配置Android Lint和Checkstyle

Enable git-hook

在project的.git/hooks的目錄下,可以看到以.sample結(jié)尾的各種git hook shell文件,加.sample后綴的原因是讓當(dāng)前project的git hooks默認(rèn)disable,如果去掉sample后綴,則對(duì)應(yīng)的hook生效。比如去掉pre-commit.sample的后綴,則sample的pre-commit里面的內(nèi)容就會(huì)在git commit之前執(zhí)行,如果shell最后的?不等于0,則說明當(dāng)前pre-commit運(yùn)行出錯(cuò)(如果配置了單元測試,有測試failed后,?就不等于0),git commit就不會(huì)執(zhí)行。

那么如何配置git-hook呢?

  • 方法一(推薦,自動(dòng)配置):可以通過在Android里面添加task的dependsOn關(guān)系將,project中的hooks/pre-xxx拷貝到.git/hooks下:


    image.png

    因?yàn)椴幌脶槍?duì)單獨(dú)的subproject的build.gradle進(jìn)行配置,所以放在了rootProject下:


    image.png

    當(dāng)然最前面還要apply下:apply from: "${rootProject.projectDir}/gradle/git-hooks.gradle",至于為什么在subproject的afterEvaluate做,是因?yàn)閜reBuild這些subProject的task是在subproject的evaluate后,才獲取得到。當(dāng)然也不能直接寫preBuild dependson installGitHooks,preBuild應(yīng)該是在java/android plugin中引入的(而這個(gè)一般在subproject中才apply)
  • 方法二:在git版本大于2.9的時(shí)候,在project的根目錄新建一個(gè)hooks目錄,專門用來放置git-hooks的文件,比如新添加一個(gè)pre-commit shell文件,內(nèi)容是運(yùn)行測試,如:./gradlew test。使用config配置的命令:git config core.hooksPath hooks,hooks是指向project新建的目錄hooks。這時(shí)候運(yùn)行g(shù)it commit就會(huì)先去跑測試。
  • 方法三:使用symlink建一個(gè)軟鏈接到默認(rèn)的.git/hooks下,同樣的在project新建一個(gè)hooks目錄,下面放置pre-commit文件運(yùn)行測試, 然后在.git/hooks目錄下,將pre-commit.sample的后綴去掉,這時(shí)候沒添加鏈接前,git commit會(huì)運(yùn)行sample里面的內(nèi)容,但是通過命名:ln -s -f ../../hooks/pre-commit .git/hooks/pre-commit,就可以找到project新建的hooks下自定義的pre-commit內(nèi)容。
  • 方法四:通過使用git的tempalte directory,在clone和init的時(shí)候會(huì)進(jìn)行默認(rèn)的拷貝。具體實(shí)現(xiàn)大家可以下來動(dòng)手嘗試。
    好的,說完這樣配置git-hooks之后,再看下這樣配置checkstyle和Android lint

git-hook配置Android checkstyle

其實(shí)配置checkstyle很簡單,因?yàn)槿绻鹀heckstyle檢查有issue時(shí)候,它的$?就是不等于0,成功則等于0,所以直接在pre-commit里面添加:

./gradlew ${project}:checkstyle
# 如果不想輸出顯示的話,運(yùn)行
./gradlew ${project}:checkstyle >/dev/null

git-hook配置Android lint

配置Android的lint在我測試的project稍微麻煩下,因?yàn)楸粶y的project,在運(yùn)行l(wèi)int的時(shí)候,總是被一些非lint的錯(cuò)誤中斷,所以在build.gradle中添加了以下配置:

lintOptions {
    abortOnError false
}

在配置了以下的選項(xiàng)后,表示即使在運(yùn)行l(wèi)int遇到錯(cuò)誤也不中斷。lint運(yùn)行完成之后不管是否有issue,$?都是0(成功)。

所以暫時(shí)用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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容