最近公司要做靜態(tài)代碼分析渴丸,對(duì)現(xiàn)在的代碼自動(dòng)化CodeReview來(lái)提高代碼質(zhì)量。方式有很多種我們使用OCLint進(jìn)行代碼分析刃榨。把集成的步驟記錄下來(lái)社裆,為以后查看方便拙绊,也可以為其他人提供參考向图。
OCLint有三個(gè)指令
- oclint:基礎(chǔ)指令泳秀。通過(guò)這個(gè)指令可以指定加載驗(yàn)證規(guī)則标沪、編譯代碼、分析代碼和生成報(bào)告嗜傅。
- oclint-json-compilation-database:從編譯好的compile_commands.json文件中讀取配置信息并執(zhí)行oclint金句。
- oclint-xcodebuild通過(guò)這個(gè)指令可以從 Xcode 的 xcodebuild.log 文件導(dǎo)出編譯選項(xiàng)并保存成 JSON Compilation Database 格式。然后把保存到 compile_commands.json 文件中吕嘀。
安裝OCLint和其他工具
如果有權(quán)限問(wèn)題可在命令前面加上"sudo"
1.安裝oclint违寞,使用Homebrew是最簡(jiǎn)單的。在終端輸入下面的命令
brew tap oclint/formulae
brew install oclint
安裝完成oclint后可以 終端執(zhí)行oclint看是否安裝成功偶房,如果是下面提示證明安裝成功
oclint: Not enough positional command line arguments specified!
Must specify at least 1 positional argument: See: oclint -help
2.下面還需要用到xcpretty工具趁曼,在終端中輸入下面命令安裝
gem install xcpretty
使用OCLint兩種方式xcode中使用和jenkins集成使用
Xcode集成使用
1.我們?cè)陧?xiàng)目中創(chuàng)建一個(gè)新的 target,然后選擇 Aggregate 作為模板
2.創(chuàng)建完成后在 Build Phases 選項(xiàng)卡中選擇 Add Run Script
3.執(zhí)行腳本
將oclint.sh腳本放入工程根目錄下棕洋,添加腳本執(zhí)行路徑
bash ./oclint.sh
下面是腳本內(nèi)容挡闰,將腳本中最下面的xxxx替換自己工程的名字后就可以command+B執(zhí)行了,可以生成一個(gè)html格式的分析報(bào)告掰盘。也可以根據(jù)自己的需求輸出到xcode上面更改腳本中參數(shù)配置就可以摄悯。
#!/bin/bash
# 指定編碼
export LANG="zh_CN.UTF-8"
export LC_COLLATE="zh_CN.UTF-8"
export LC_CTYPE="zh_CN.UTF-8"
export LC_MESSAGES="zh_CN.UTF-8"
export LC_MONETARY="zh_CN.UTF-8"
export LC_NUMERIC="zh_CN.UTF-8"
export LC_TIME="zh_CN.UTF-8"
export LC_ALL=
function checkDepend () {
command -v xcpretty >/dev/null 2>&1 || {
echo >&2 "I require xcpretty but it's not installed. Install:gem install xcpretty";
exit
}
command -v oclint-json-compilation-database >/dev/null 2>&1 || {
echo >&2 "I require oclint-json-compilation-database but it's not installed. Install:brew install oclint";
exit
}
}
function oclintForProject () {
# 檢測(cè)依賴
checkDepend
projectName=$1
scheme=$2
reportType=$3
REPORT_PMD="pmd"
REPORT_XCODE="xcode"
myworkspace=${projectName}
myscheme=${scheme}
echo "myworkspace是:${myworkspace}"
echo "myscheme是:${myscheme}"
echo "reportType為:${reportType}"
# 清除上次編譯數(shù)據(jù)
if [ -d ./build/derivedData ]; then
echo '-----清除上次編譯數(shù)據(jù)derivedData-----'
rm -rf ./build/derivedData
fi
# xcodebuild -workspace $myworkspace -scheme $myscheme clean
xcodebuild clean
echo '-----開(kāi)始編譯-----'
# 生成編譯數(shù)據(jù)
xcodebuild -workspace ${myworkspace} -scheme ${myscheme} -sdk iphonesimulator -derivedDataPath ./build/derivedData -configuration Debug COMPILER_INDEX_STORE_ENABLE=NO | xcpretty -r json-compilation-database -o compile_commands.json
if [ -f ./compile_commands.json ]
then
echo '-----編譯數(shù)據(jù)生成完畢-----'
else
echo "-----生成編譯數(shù)據(jù)失敗-----"
return -1
fi
echo '-----分析中-----'
# 自定義排除警告的目錄,將目錄字符串加到數(shù)組里面
# 轉(zhuǎn)化為:-e Debug.m -e Port.m -e Test
exclude_files=("cardloan_js" "Pods")
exclude=""
for i in ${exclude_files[@]}; do
exclude=${exclude}"-e "${i}" "
done
echo "排除目錄:${exclude}"
# 分析reportType =~判斷子字符串包含關(guān)系
if [[ ${reportType} =~ ${REPORT_PMD} ]]
then
nowReportType="-report-type html -o pmd.html"
else
nowReportType="-report-type xcode"
fi
# 自定義report 如:
# nowReportType="-report-type html -o oclint_result.html"
# 生成報(bào)表
oclint-json-compilation-database ${exclude} -- \
${nowReportType} \
-rc=LONG_CLASS=1500 \
-rc=NESTED_BLOCK_DEPTH=5 \
-rc=LONG_VARIABLE_NAME=80 \
-rc=LONG_METHOD=200 \
-rc=LONG_LINE=300 \
-disable-rule ShortVariableName \
-disable-rule ObjCAssignIvarOutsideAccessors \
-disable-rule AssignIvarOutsideAccessors \
-max-priority-1=100000 \
-max-priority-2=100000 \
-max-priority-3=100000
rm compile_commands.json
if [[ ${reportType} =~ ${REPORT_PMD} ]] && [ ! -f ./pmd.xml ]
then
echo "-----分析失敗-----"
return -1
else
echo '-----分析完畢-----'
return 0
fi
}
# 替換workspace的名字
myworkspace="xxxx.xcworkspace"
# 替換scheme的名字
myscheme="xxxx"
# 輸出方式 xcode/pmd
reportType="pmd"
oclintForProject ${myworkspace} ${myscheme} ${reportType}
下面是一些參數(shù)選項(xiàng)愧捕,可以是規(guī)則加載選項(xiàng)奢驯、報(bào)告形式選項(xiàng)
- -disable-rule <規(guī)則名> 通過(guò)規(guī)則名使某些驗(yàn)證規(guī)則失效
-rc <參數(shù)>=<值> 修改某些閾值
名稱 | 描述 | 默認(rèn)值 |
---|---|---|
CYCLOMATIC_COMPLEXITY | 循環(huán)嵌套數(shù)限制 | 10 |
LONG_CLASS | 類行數(shù)限制 | 1000 |
LONG_LINE | 每行的字符限制 | 100 |
LONG_METHOD | 方法行數(shù)限制 | 50 |
LONG_VARIABLE_NAME | 參數(shù)名字符限制 | 20 |
MAXIMUM_IF_LENGTH | if 的行數(shù)限制 | 15 |
MINIMUM_CASES_IN_SWITCH | switch case 的最小數(shù)目 | 3 |
NPATH_COMPLEXITY | 通過(guò)該方法的非循環(huán)執(zhí)行路徑數(shù)量限制 | 200 |
NCSS_METHOD | 連續(xù)未注釋行數(shù)限制 | 30 |
NESTED_BLOCK_DEPTH | block 嵌套層數(shù)限制 | 5 |
SHORT_VARIABLE_NAME | 變量名的最小字符數(shù)限制 | 3 |
TOO_MANY_FIELDS | 類成員限制 | 20 |
TOO_MANY_METHODS | 類方法數(shù)限制 | 30 |
TOO_MANY_PARAMETERS | 參數(shù)個(gè)數(shù)限制 | 10 |
- -report-type <報(bào)告類型>有"text"、“html”次绘、“json”瘪阁、“pmd”、“xcode”幾個(gè)類型
- -o 指定報(bào)告的輸出目標(biāo)邮偎。
- oclint-json-compilation-database 指令有過(guò)濾文件選項(xiàng)
-i :包含進(jìn)某些文件
-e : 過(guò)濾掉某些文件
jenkins集成使用
jenkins安裝
參考鏈接:http://www.reibang.com/p/98541e989202
jenkins安裝時(shí)候需要獲取初始的管理員密碼Permission denied問(wèn)題
參考鏈接:http://www.reibang.com/p/0d6db1789382
首先安裝兩個(gè)插件PMD和EmailExtendedPlugin
- jenkins集成時(shí)候需要將上面腳本輸出格式修改:-report-type pmd -o pmd.xml
- 修改腳本中路徑代碼用全路徑添加“/usr/local/bin/”
/usr/local/bin/xcpretty -r json-compilation-database -o compile_commands.json
/usr/local/bin/oclint-json-compilation-database ${exclude}
一.完成分析后生成報(bào)告需要發(fā)送郵件罗洗,首先需要進(jìn)行郵件配置。進(jìn)入系統(tǒng)配置
我這里用qq郵箱發(fā)送钢猛。userName郵箱地址和管理員的一致伙菜,密碼是qq授權(quán)碼不是郵箱密碼。SMTPport用的465(qq配置是465命迈,一般都是是25)在最下方點(diǎn)擊“DefaultTriggers”配置觸發(fā)器選中always贩绕。開(kāi)啟qq郵箱的smtp服務(wù)參考鏈接:http://service.mail.qq.com/cgi-bin/help?id=28&no=166&subtype=1
和上面的配置一致。這里可以發(fā)送測(cè)試郵件測(cè)試配置是否配置成功
二.創(chuàng)建和配置一個(gè)Jenkins項(xiàng)目
- 源碼管理用的svn
- 將上面腳本代碼放入到執(zhí)行shell里面
-
構(gòu)建后操作
構(gòu)建后操作 -
構(gòu)建后操作中選中EditableEmailNotification
項(xiàng)目中郵件配置
Project Recipient List郵件接收人列表壶愤,多個(gè)可以換行或者逗號(hào)隔開(kāi)
Default Subject郵件主題
Default Content郵件內(nèi)容 -
在高級(jí)里面設(shè)置郵件觸發(fā)條件
郵件觸發(fā)條件
6.構(gòu)建完成后會(huì)出現(xiàn)PMD Warnings,點(diǎn)擊查看報(bào)表
構(gòu)建完成查看報(bào)表
參考鏈接
http://www.reibang.com/p/c6cc551e2ca3
https://segmentfault.com/a/1190000005150573
http://www.cocoachina.com/ios/20170928/20669.html
http://www.reibang.com/p/4d9d33c31edd
官方文檔:http://oclint-docs.readthedocs.io/en/stable/
郵件配置:https://www.centos.bz/2018/01/jenkins-%E9%82%AE%E4%BB%B6%E9%85%8D%E7%BD%AE/
https://blog.csdn.net/galen2016/article/details/77975965