此文已由做者楊曉受權網易雲社區發佈。
html
歡迎訪問網易雲社區,瞭解更多網易技術產品運營經驗。
git
在Mac OS系統上,採用Xcodebuild Analyze命令和OClint工具,對iOS項目進行靜態代碼檢查,輸出可視化結果。而後將項目持續集成至CI平臺,並使用PMD插件進行錯誤統計的展現。對此,本文由如下4個要點來闡述。github
背景web
Xcodebuild命令行指令shell
oclint工具獲取可視化結果json
持續集成xcode
1.背景
AR家裝是感知與智能中心的一個新項目,經過AR和VR技術,在iOS平臺上能夠很好地展示樣板間設計和傢俱的實時場景。場景展現的功能是由Unity來完成,iOS主要負責UI和先後臺交互的功能,好比登陸、權限管理、下載等。因爲項目成立不久,開發進度比較趕,代碼以實現功能爲主導,所以會對後續的代碼管理和程序設計帶來較大的隱患。對此,QA但願經過對項目進行按期靜態代碼檢查,來實現iOS端代碼質量控制,以下降項目風險。安全
OC的靜態代碼檢查工具比較常見的有Clang-Analyzer、 OClint等,qablog上有一篇關於Clang-Analyzer的介紹 iOS靜態代碼檢查工具Clang Static Analyzer介紹。本人採用Clang-Analyzer方法在Terminal中嘗試,發現項目中引用的一些第三方庫,對一些版本號限制的編譯平臺會編譯失敗,嘗試解決無果後轉而使用OClint。ruby
本項目採用Xcode自帶命令行Xcodebuild的Analyze功能,結合OClint工具,在Jenkins上集成靜態代碼檢查。在實戰的過程當中遇到了一些問題,繞了一些彎路,記錄下來但願對其餘項目有所幫助。bash
環境配置:
Mac OS: 10.10.5(包括slave節點)
Souce Control: Git
Xcode Version: 7.3.1
OClint Version: 0.10.3
xcpretty
2.Xcodebuild命令行指令
其實,Xcode工具包含了靜態代碼分析的功能,打開項目程序,點擊菜單的Product->Analyze便可對代碼進行掃描。
入口如圖1所示:
通過長時間地解析後,最終獲得結果如圖2所示:
這種檢查方法的好處在於方便,直接在Xcode中運行,能按不一樣的方式查看檢查結果,並能準確地定位出錯位置。
但對於QA來講,不足之處也是顯而易見的,整個過程須要按期執行靜態代碼檢查,分類統計的結果雖適合開發自查,但並不適用於QA對代碼質量把控。
對於命令行執行靜態代碼檢查,能夠利用Xcodebuild指令在命令行中執行Build、Analyze和Clean等功能,如下簡單介紹下Analyze和Clean的用法。
Xcodebuild Analyze
Xcodebuild功能很是強大,具體的用法能夠經過man xcodebuild來查看。本項目主要用到的是clean、analyze操做和一些配置信息。
Xcodebuild指令基本用法介紹以下,須要進入到當前項目所在的目錄(projectName.xcproj或workspaceName.xcworkspace文件所在目錄),而後執行相應指令,以下圖3所示。
xcodebuild [-project projectname][-target targetname ...] [configuration configurationname][-sdk [sdkfullpath | sdkname]] [buildaction ...] [setting=value ...][-userdefault=value ...]
因爲AR項目包含了iOS項目和Unity項目,兩個project在同一個workspace下,所以須要加入-workspace workspaceName.xcworkspace和-scheme schemeName。若是不加入參數,在xcodebuild執行過程當中,可能會出現相似ld: library not found for -lxxxx的錯誤。
總結一下,其實到這一步就已經完成了最重要的靜態代碼檢查工做了:xcodebuild -workspace workspaceName.xcworkspace -scheme schemeName analyze
Xcodebuild Clean
靜態代碼檢查會生成.o連接文件,執行過一次xcodebuild analyze後,若是此文件沒有變化就不會再次編譯。而可視化結果的輸出實際上是依賴命令行的輸出結果,若是跳過了編譯過程,log中就不會有warning的記錄,就會默認當前文件是沒有錯誤的。所以每次編譯前都須要清空項目一些中間過程的生成文件,以確保每次檢查都是從新生成的連接庫。對此,簡單執行xcodebuild clean便可。
Xctool工具
Xctool工具是Xcodebuild命令行的一個替代產品。包含了xcpretty的功能。上述步驟也可用Xctool來執行
安裝配置Xctool,以下圖4所示。
brew install xctool
安裝完成後Xctool位於/usr/local/bin目錄下,執行以下命令行能夠生成文中將提到的OClint能夠解析的文件格式,以下圖5所示。
shellxctool -workspace workspaceName.xcworkspace -scheme schemeName cleanxctool -workspace workspaceName.xcworkspace -scheme schemeName -reporter json-compilation-database:compile_commands.json
3.OClint工具
- OClint在本項目中的做用是對Xcodebuild產生的log進行分析,獲取相關數據後生成html文件或pmd文件。
OClint安裝及配置
從OClint的GitHub項目連接中下載安裝包oclint-0.10.3-x86_64-darwin-15.5.0.tar.gz.
解壓後,在當前用戶的.bashrc目錄下配置環境變量,以下圖6所示
OCLINT_HOME=/pathexport PATH=$PATH:OCLINT_HOME/bin
而後執行source .bashrc便可
運行OClint確認環境配置是否正確,以下圖7所示。
$ oclintoclint: Not enough positional command line arguments specified! Must specify at least 1 positional arguments: See: oclint -help
Xcodebuild 與 OClint結合
根據OClint官網的教程,執行以下:
xcodebuild analyze | tee xcodebuild.log將xcodebuild analyze的輸出信息記錄在xcodebuild.log中。
oclint-xcodebuild xcodebuild.log 對log進行解析,生成compile_command.json。進行到這一步後命令行提示,以下圖8所示:
This binary is no longer under maintenance by OCLint team.Please consider using xcpretty (https://github.com/supermarin/xcpretty) instead!
對此,咱們採用xcpretty,xcpretty能夠用gem install xcpretty來下載安裝。根據教程,xcpretty能夠經過--report json-compilation-database來生成OClint所需的json文件。所以合併前兩步,以下圖9所示:
xcodebuild analyze | tee xcodebuild.log | xcpretty --report json-compilation-database
須要注意的是,這一步生成的json文件在build/reports目錄下,而且名爲compilation_db.json,和OClint默認生成的文件命名和路徑均不一樣,所以須要移動至根目錄並重命名爲compile_command.json。
若採用Xctool能夠按照前文中給出的命令直接生成正確的compile_command.json文件。
最後一步生成html或pmd文件,以下圖10所示
oclint-json-compilation-database -e Pods-- -report-type pmd -o report.html
其中 -e Pods爲去掉第三方庫的靜態代碼檢查錯誤。 -report-type pmd能夠選擇爲pmd格式輸出,方便在Jenkins中經過PMD插件查看結果。-o report.html爲指定輸出文件名稱。
參數配置,第一次運行的時候OClint會報錯,須要進行參數配置,以下圖11所示。
violation exceed threshold P0=0[0], P1=41[10], P2=200[20]
查了一些資料發現,P1=41[10]是說P1(Normal級別 Warning)發現41個,可是限制爲10個,超過10個則失敗。所以經過-max-priority-2=9999修改閾值。另外,還能夠經過-disable-rule=LongLine來根據須要過濾一些warning的類型,具體的能夠查閱文檔或生成結果。
4.持續集成至Jenkins平臺
在集成到Jenkins平臺的過程當中,因爲是第一次使用Mac OS做爲slave機器,在用戶權限上遇到些問題。
在運行|xcpretty --report json-compilation-database的時候提示 xcpretty:command not found.
再三驗證命令行和xcpretty安裝正確後懷疑是帳號權限問題。不像Linux和Windows的slave節點,Jenkins有一個獨立的帳號來運行shell腳本。在Mac OS上,Jenkins運行的帳戶,是運行Jenkins中slave腳本的帳戶。確認了機器上全部的用戶均可以執行xcpretty命令之後,我開始質疑是不是Jenkins運行在不可見的帳戶上。爲了確認這個問題,查閱了一些資料後,發現能夠經過Jenkins管理網站節點的System Info來確認,以下圖12所示。
從圖中,咱們能夠看到所用帳號的確是經常使用的netease帳號,可是netease帳號倒是能夠執行xcpretty指令的。接着往下看,發現PATH變量與Terminal中查看到的PATH變量不一樣,感受找到了問題所在。在執行腳本中加入以下語句便可,如圖13所示。
export PATH=$PATH:/Users/netease/.rvm/gems/ruby-2.1.1/bin
OCLINT_HOME=/Users/netease/Downloads/oclint-0.10.3export PATH=$PATH:$OCLINT_HOME/bin
至此Job配置完成,在配置中,加入Add Post-build Actions中的Publish PMD analysis results便可完成配置。PMD文件的生成結果以下圖15所示。
不過截止我寫完這篇文章,彷佛OClint的PMD報告不支持編譯錯誤和警告的數據展現。考慮到數據的完整性,也可採用Html報告的格式。只須要將上一部中的Publish PMD analysis result改成Publish HTML Reports便可。
更多網易技術、產品、運營經驗分享請點擊。
相關文章:
【推薦】 Omad羣組部署、依賴部署一鍵解決
【推薦】 ThreeJs 基礎入門
【推薦】 Android事件分發機制淺析(2)