一.run-sonar-swift腳本
sonar-swift官方提供了一個專門用于代碼掃描的腳本在旱,無需我們自己去編寫腳本處理編譯工程,輸出編譯log文件等操作规丽,??傳送門。
這個腳本需要搭配sonar-prooject.properties文件來使用。先看一下腳本關鍵內容第队;
vflag=""
nflag=""
unittests=""
swiftlint="on"
tailor="on"
lizard="on"
oclint=""
infer="on"
fauxpas=""
sonarscanner=""
sonarurl="http://localhost:9000"
sonarlogin="admin"
sonarpassword="123456"
這一部份是指你需要哪些插件參與掃描過程,如果有需要就賦值為on
刨秆,前提是你有安裝這些插件凳谦,其次就是你需要上傳的地址以及登錄信息。
# Source directories for .swift files
srcDirs=''; readParameter srcDirs 'sonar.sources'
# The name of your application scheme in Xcode
appScheme=''; readParameter appScheme 'sonar.swift.appScheme'
# The app configuration to use for the build
appConfiguration=''; readParameter appConfiguration 'sonar.swift.appConfiguration'
# The name of your test scheme in Xcode
testScheme=''; readParameter testScheme 'sonar.swift.testScheme'
# The name of your other binary files (frameworks)
binaryNames=''; readParameter binaryNames 'sonar.coverage.binaryNames'
# Get the path of plist file
plistFile=`xcodebuild -showBuildSettings -project "${projectFile}" | grep -i 'PRODUCT_SETTINGS_PATH' -m 1 | sed 's/[ ]*PRODUCT_SETTINGS_PATH = //'`
# Number version from plist if no sonar.projectVersion
numVersionFromPlist=`defaults read "${plistFile}" CFBundleShortVersionString`
# Read destination simulator
destinationSimulator=''; readParameter destinationSimulator 'sonar.swift.simulator'
# Read tailor configuration
tailorConfiguration=''; readParameter tailorConfiguration 'sonar.swift.tailor.config'
# The file patterns to exclude from coverage report
excludedPathsFromCoverage=''; readParameter excludedPathsFromCoverage 'sonar.swift.excludedPathsFromCoverage'
# Skipping tests
skipTests=''; readParameter skipTests 'sonar.swift.skipTests'
這一部份是你的項目工程信息衡未,比如你要檢測的文件夾srcDirs
尸执,項目的SchemeappScheme
等內容家凯,你可以選擇直接填在腳本文件中,也可以填在sonar-prooject.properties里面如失,注意看readParameter srcDirs 'sonar.sources'
這一句绊诲,它的意思就是如果這里沒填寫,就會讀取sonar-prooject.properties文件中的sonar.sources
字段褪贵。
以下是sonar-prooject.properties中必填的幾個選項
sonar.swift.project=TestDemo.xcodeproj
sonar.swift.workspace=TestDemo.xcworkspace
sonar.swift.appScheme=TestDemo
sonar.projectKey=TestDemo //用于sonar平臺獲取項目的key
sonar.projectName=TestDemo //用于sonar平臺展示項目名稱
sonar.sourceEncoding=UTF-8
sonar.language=swift,objc
sonar.sources=ComponentModules
sonar.projectVersion=1.0.2
如果你的sonar-prooject.properties文件中已經填寫了這些內容掂之,就無需在run-sonar-swift腳本中進行改動。
繼續(xù)看run-sonar-swift腳本脆丁;
# Objective-C code detection
hasObjC="yes"
compileCmdFile=compile_commands.json
minimumSize=3
actualSize=$(stat -f%z "$compileCmdFile")
if [ $actualSize -ge $minimumSize ]; then
hasObjC="yes"
fi
如果你的項目是混編世舰,一定要在這個地方進行設置,不然就會跳過后續(xù)的oc代碼檢測槽卫。OCLint跟压,F(xiàn)auxPas這兩個插件是專門檢測OC代碼的,如果這個地方不設置為yes
便會跳過晒夹。
二.坑人的-ivfsstatcache
如果你突然發(fā)現(xiàn)此前跑的好好的OCLint裆馒,infer等插件突然不好好工作了,這個就是罪魁禍首丐怯,因為clang編譯器現(xiàn)在輸出的文件會新增一個-ivfsstatcache
字段喷好,這些通過compile_commands.json文件來分析語法問題的插件就會無法識別,這是一個神坑读跷,查了好久資料才找到解決辦法梗搅,使用腳本刪除所有這個字段對應的key-value即可。
sed 's/-ivfsstatcache [^ ]*//g' < compile_commands.json > icompile_commands.json
mv icompile_commands.json compile_commands.json
三.拉取sonar平臺的數(shù)據(jù)
sonar平臺提供了對外的api接口效览,但是無法通過token進行數(shù)據(jù)的拉取无切,即使填對了token也不行,因為提交token的時候需要進行處理丐枉,需要將token后面加一個:
哆键,然后整體進行base64編碼,得出結果再在前面加一個basic才可以瘦锹,例子如下:
curl -G -H'Authorization:basic 你的token+:然后再進行base64編碼' http://localhost:9000/api/measures/component\?component\=TestDemo\&metricKeys\=ncloc
這樣才能正常的進行數(shù)據(jù)拉取籍嘹。