Jenkins集成iOS代碼靜態(tài)分析工具Infer實(shí)踐

為了提高代碼質(zhì)量,減少coderewview的工作量,我最近調(diào)研了iOS代碼靜態(tài)分析工具。主要研究了Infer安裝使用工作原理以及如何結(jié)合Jenkins生成iOS代碼靜態(tài)分析報(bào)告。本文簡(jiǎn)單介紹了Jenkins和Infer的使用,主要是介紹Jenkins如何使用Infer,以及集成Infer過(guò)程中所遇到的問(wèn)題

Jenkins 概述

Jenkins是最流行的開源免費(fèi)持續(xù)集成工具,他提供了一種易于使用的持續(xù)集成系統(tǒng),使開發(fā)者從繁雜的集成(例如app打包)中解脫出來(lái),專注于更為重要的業(yè)務(wù)邏輯實(shí)現(xiàn)上。同時(shí) Jenkins 能實(shí)時(shí)監(jiān)控集成中存在的錯(cuò)誤,提供詳細(xì)的日志文件和提醒功能,還能用圖表的形式形象地展示項(xiàng)目構(gòu)建的趨勢(shì)和穩(wěn)定性。Jenkins提供了豐富的管理和配置的功能,包括系統(tǒng)配置、管理插件、查詢系統(tǒng)信息、系統(tǒng)日志、節(jié)點(diǎn)管理、Jenkins命令行窗口、信息統(tǒng)計(jì)等功能。而且,Jenkins提供了非常豐富的插件支持,這為提高軟件開發(fā)效率并保障軟件開發(fā)質(zhì)量提供很多便利。

Infer 概述

Facebook的Infer是一個(gè)由 OCaml 編寫的靜態(tài)分析工具。他并不是簡(jiǎn)單糾正一下語(yǔ)法,而是一種代碼靜態(tài)分析工具。它可以在不運(yùn)行代碼(一般開發(fā)者的調(diào)試方式都是編譯、運(yùn)行,查看結(jié)果,然后人工分析代碼)的方式下,通過(guò)詞法分析、語(yǔ)法分析、控制流、數(shù)據(jù)流分析等技術(shù)對(duì)程序代碼進(jìn)行掃描,來(lái)驗(yàn)證代碼是否存在問(wèn)題或滿足技術(shù)指標(biāo)。Infer 可以分析 Objective-C, Java 或者 C 代碼,重點(diǎn)作用于分析APP(Android/iOS)項(xiàng)目,報(bào)告潛在的問(wèn)題。Infer能將代碼分解,小范圍分析后再將結(jié)果整合在一起,兼顧分析的深度和速度,支持增量及非增量分析。

Infer原理

下面的圖描述了Infer的工作流:

圖片

Infer run的時(shí)候分兩個(gè)階段:

  1. 捕獲階段: Infer通過(guò)編譯工具把代碼轉(zhuǎn)譯為Infer自己的中間語(yǔ)言來(lái)做靜態(tài)分析。轉(zhuǎn)譯依賴于編譯,轉(zhuǎn)譯之后的中間文件存儲(chǔ)在infer-out 文件夾中。
  2. 分析階段:
    在這個(gè)階段,infer-out文件夾下的中間件文件會(huì)被Infer分析,當(dāng)檢測(cè)到一個(gè)函數(shù)錯(cuò)誤的時(shí)候,會(huì)暫停對(duì)這個(gè)函數(shù)的分析,但是不會(huì)停止對(duì)其他函數(shù)的分析。當(dāng)你修復(fù)完發(fā)現(xiàn)的錯(cuò)誤的后,再次運(yùn)行Infer可以檢查bug是否被修復(fù)。 最終Infer的分析結(jié)果會(huì)保存在infer-out/report.txt文件中??捎猛ㄟ^(guò)Infer 命令轉(zhuǎn)成html格式和xml格式。
  3. object-c中Infer檢測(cè)的問(wèn)題類型都有哪些?
    1. 內(nèi)存泄露,循環(huán)引用
    2. 變量過(guò)早設(shè)置nil導(dǎo)致的問(wèn)題
    3. Parameter not null checked
    4. Ivar not null checked

Infer 安裝

Mac OS 系統(tǒng)通過(guò)brew安裝:

brew install infer                  

Infer 使用

  1. 針對(duì)project項(xiàng)目:

    //xxxApp 是你project中App target名稱
    infer -- xcodebuild -target xxxApp -configuration Debug -sdk iphonesimulator
    
  2. 針對(duì)workspace工程項(xiàng)目

    infer -- xcodebuild -workspace 你的workspac名稱.xcworkspace  -scheme 工程中scheme名稱 -configuration Debug -sdk iphonesimulator
    
  3. 可以指定分析哪些文件,即whitelist和blacklist

    項(xiàng)目根目錄下創(chuàng)建一個(gè)‘.inferconfig’的文件,格式如下:

    {
        "infer-whitelist-path-regex":[
        ],
        "infer-blacklist-path-regex":[
         "Pods/AFNetworking",
         "Pods/SDWebImage"
        ]
    }
    
  4. 導(dǎo)出生成html的命令,infer運(yùn)行完成之后再終端輸入如下命令:

    infer-explore --html
    

這之后會(huì)生成infer-out/report.html文件

  1. 生成pmd xml文件方便Jekins 的pmd插件展示結(jié)果。

    infer --pmd-xml  -- xcodebuild -workspace 你的workspac名稱.xcworkspace  -scheme 工程中scheme名稱 -configuration Debug -sdk iphonesimulator
    

    這個(gè)命令執(zhí)行的時(shí)候可能會(huì)出錯(cuò),要求你安裝pyhton的lxml 庫(kù),這時(shí)在終端輸入下面的命令即可安裝lxml:

    STATIC_DEPS=true sudo pip install lxml       
    

安裝lxml成功后,再次運(yùn)行生成xml命令,最終會(huì)在infer-out文件加下生成report.xml文件。

  1. Infer 非增量分析命令

    infer --reactive -- xcodebuild -target xxxApp -configuration Debug -sdk iphonesimulator
    

Jenkins集成Infer步驟

Jenkins 構(gòu)建項(xiàng)目的不是本文的重點(diǎn),這里不再敘述,主要寫一下Infer腳本配置。

Jenkins構(gòu)建Infer腳本

首先進(jìn)入項(xiàng)目的配置界面,選擇構(gòu)建欄目,點(diǎn)擊增加構(gòu)建步驟,具體如下圖:

構(gòu)建1.png

選擇Execute shell , 輸入如下圖所示的命令:

構(gòu)建2.png

這些命令就是分析工程內(nèi)文件,最終通過(guò)infer 生成xml文件供Jenkins PMD 分析展示分析報(bào)告。

PMD 插件設(shè)置

首先Jenkins需要安裝PMD插件,這個(gè)網(wǎng)上搜索教程安裝即可。其次在項(xiàng)目配置里面配置PMD 具體如下圖所示:

PMD1.png

在構(gòu)建后操作欄目下面,代價(jià)增加構(gòu)建后操作,選擇Publish PMD analysis results 選項(xiàng),結(jié)果如下圖:


PMD2.png

輸入 report.xml路徑 ,如下圖:


PMD3.png

最后點(diǎn)擊保存。回到項(xiàng)目主頁(yè),點(diǎn)擊立即構(gòu)建。構(gòu)建完成后,最終在會(huì)有PMD Warings 菜單欄,如下圖所示:


result1.png

如上圖所示PMD Thrend圖表可以看到項(xiàng)目多次構(gòu)建后代碼質(zhì)量的趨勢(shì)。這里就可以看出代碼質(zhì)量近期內(nèi)的波動(dòng)。

點(diǎn)擊PMD Warnings 可以看到本次構(gòu)建的詳細(xì)錯(cuò)誤情況,結(jié)果如下圖:

result2.png

這里我可以看到總的分析結(jié)果,Detail 欄目下各個(gè)選項(xiàng)能夠看到錯(cuò)誤所在的文件,以及錯(cuò)誤類型等等。具體說(shuō)Detail下各個(gè)欄目的作用

  • Files 是發(fā)生錯(cuò)誤的文件列表

  • People是git代碼庫(kù)貢獻(xiàn)的人員

  • Types 檢查出的代碼錯(cuò)誤類型

  • Warnings是警告

  • Origin定位錯(cuò)誤產(chǎn)生的開發(fā)人員的提交的commit ID

  • Details 具體產(chǎn)生bug代碼的位置,能夠定位代碼到行。

  • New 展示新增bug列表

  • Fix 展示已修復(fù)bug問(wèn)題列表

最后編輯于
?著作權(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),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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