OClint實現(xiàn)代碼靜態(tài)分析(IOS)

2018年4月24日
一.遠端垃圾桶上用jenkins運行靜態(tài)分析腳本老是不成功 【但用終端命令運行腳本就ok:sh PMDOclint.sh】
1.報如下錯誤:
env: ruby_executable_hooks: No such file or directory
2.原因分析:
我是用hu317登錄,用如下命令安裝的sudo gem install -n /usr/local/bin xcpretty
因為用終端運行運行腳本正常裹粤,應(yīng)該不是腳本的問題(其實終端用戶也是hu317)知给;
但jenkins構(gòu)建用的是jenkins賬號琉历,xcpretty命令里面有些依賴命令可能用的是相對路徑揭芍,導(dǎo)致用jenkins執(zhí)行時報命令找不到錯誤亚侠〗畈【不是所有命令都有問題包蓝,oclint就正吃劭郏】


image.png

3.解決:指定對應(yīng)路徑下的命令(用wrappers 參考這個鏈接

export xcpretty=/Users/hu317/.rvm/gems/ruby-2.3.0/wrappers/xcpretty

#!/bin/bash

function oclintForProject () {
# 指定編碼
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 xcpretty=/Users/hu317/.rvm/gems/ruby-2.3.0/wrappers/xcpretty
export LC_ALL=

myworkspace=317hu.xcworkspace # 替換workspace的名字
myscheme=317hu # 替換scheme的名字

# 清除上次編譯數(shù)據(jù)
if [ -d ./derivedData ];
then
echo '-----清除上次編譯數(shù)據(jù)derivedData-----'
rm -rf ./derivedData
fi

xcodebuild -workspace $myworkspace -scheme $myscheme clean
#xcodebuild clean

# 生成編譯數(shù)據(jù)
xcodebuild -workspace $myworkspace -scheme $myscheme -configuration Debug | $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

# 生成報表
/usr/local/bin/oclint-json-compilation-database -e Pods -- \
-report-type pmd -o pmd.xml \
-rc LONG_LINE=200 \
-disable-rule ShortVariableName \
-disable-rule ObjCAssignIvarOutsideAccessors \
-disable-rule AssignIvarOutsideAccessors \
-max-priority-1=100000 \
-max-priority-2=100000 \
-max-priority-3=100000

if [ -f ./pmd.xml ]
then
rm compile_commands.json
echo '-----分析完畢-----'
return 0
else
echo "-----分析失敗-----"
return -1
fi
}

oclintForProject

效果:


image.png

2017年11月7日

前提條件先安裝如下兩個命令 oclint xcpretty

#! /bin/sh
if which oclint 2>/dev/null; then
    echo 'oclint exist'
else
    brew tap oclint/formulae
    brew install oclint
fi
if which xcpretty 2>/dev/null; then
    echo 'xcpretty exist'
else
    gem install xcpretty
fi

一.xcode9 + Cocoapods項目 實現(xiàn)代碼靜態(tài)分析
方法1:直接終端命令運行绽淘。【比較耗時大概要半個小時上下】

1.直接切換到工程目錄闹伪,運行如下命令沪铭。 報如下(oclint: error: one compiler command contains multiple jobs:)

myworkspace=317hu.xcworkspace
myscheme=317hu
xcodebuild -workspace $myworkspace -scheme $myscheme clean&&
xcodebuild -workspace $myworkspace -scheme $myscheme \
-configuration Debug \
| xcpretty -r json-compilation-database -o compile_commands.json&&
oclint-json-compilation-database -e Pods -- \
-report-type html -o oclint_result.html \
-rc LONG_LINE=200 \
-max-priority-1=100000 \
-max-priority-2=100000 \
-max-priority-3=100000; \
rm compile_commands.json;
if [ -f ./oclint_result.html ]; then echo '-----分析完畢-----'
else echo "-----分析失敗-----"; fi

解決:相關(guān)配置COMPILER_INDEX_STORE_ENABLE 全部設(shè)置為NO
1.工程設(shè)置


image.png

2.Podfile 文件設(shè)置

post_install do |installer|
    installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            config.build_settings['COMPILER_INDEX_STORE_ENABLE'] = "NO"
        end
    end
end
image.png

3.修改好后再次運行如上腳本 大概30分鐘時間,工程目錄下面多了如下分析文件oclint_result.html


image.png

二.jenkins+OClint 實現(xiàn)代碼靜態(tài)分析
1.效果如下 (首次啟動花時間用了44分鐘偏瓤,第二次就快了)


image.png

image.png

2.實現(xiàn)
第一步j(luò)enkins安裝PMD Plugin插件
第二步 編寫如下腳本
【如果報/PMDOclint.sh: line 18: xcpretty: command not found xcodebuild: error: 'Gold.xcworkspace' does not exist.】
像我如下代碼用全路徑即可
/usr/local/bin/xcpretty
/usr/local/bin/oclint

#!/bin/bash
function oclintForProject () {
# 指定編碼
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=

    myworkspace=317hu.xcworkspace # 替換workspace的名字
    myscheme=317hu-DEV # 替換scheme的名字

    # 清除上次編譯數(shù)據(jù)
    if [ -d ./derivedData ];
    then
        echo '-----清除上次編譯數(shù)據(jù)derivedData-----'
        rm -rf ./derivedData
    fi

    xcodebuild -workspace $myworkspace -scheme $myscheme clean
    #xcodebuild clean

    # 生成編譯數(shù)據(jù)
    xcodebuild -workspace $myworkspace -scheme $myscheme -configuration Debug | /usr/local/bin/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

    # 生成報表
    /usr/local/bin/oclint-json-compilation-database -e Pods -- \
    -report-type pmd -o pmd.xml \
    -rc LONG_LINE=200 \
    -disable-rule ShortVariableName \
    -disable-rule ObjCAssignIvarOutsideAccessors \
    -disable-rule AssignIvarOutsideAccessors \
    -max-priority-1=100000 \
    -max-priority-2=100000 \
    -max-priority-3=100000

    if [ -f ./pmd.xml ]
    then
        rm compile_commands.json
        echo '-----分析完畢-----'
        return 0
    else 
        echo "-----分析失敗-----"
        return -1
    fi
}

oclintForProject

第三步(別忘了工程屬性參照終端命令方法1修改)

jenkins如下配置即可
image.png
# OCLint
cd ${WORKSPACE}
echo "-----分析${WORKSPACE}-----}"
bash $JENKINS_HOME/PMDOclint.sh

三.補充

1.OCLint安裝 有時候網(wǎng)絡(luò)問題導(dǎo)致會安裝失斏钡 (多試幾次會成功的,我早上試了一次就安裝ok了,昨天下午試了N次都不行)
image.png

參考

1:https://github.com/fastlane/fastlane/issues/742

Finally, I solved this issue. I set the command′s path in the script (/usr/local/bin) and everything works fine.

Thanks a lot @xfreebird @KrauseFx

2:
iOS使用OCLint做靜態(tài)代碼分析

如果您發(fā)現(xiàn)本文對你有所幫助厅克,如果您認為其他人也可能受益赔退,請把它分享出去。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末证舟,一起剝皮案震驚了整個濱河市拣展,隨后出現(xiàn)的幾起案子娃圆,更是在濱河造成了極大的恐慌妄迁,老刑警劉巖瓣赂,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鲤竹,居然都是意外死亡浪读,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門辛藻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碘橘,“玉大人,你說我怎么就攤上這事吱肌《徊穑” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵氮墨,是天一觀的道長纺蛆。 經(jīng)常有香客問我吐葵,道長,這世上最難降的妖魔是什么桥氏? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任温峭,我火速辦了婚禮,結(jié)果婚禮上字支,老公的妹妹穿的比我還像新娘凤藏。我一直安慰自己,他們只是感情好堕伪,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布揖庄。 她就那樣靜靜地躺著,像睡著了一般欠雌。 火紅的嫁衣襯著肌膚如雪蹄梢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天桨昙,我揣著相機與錄音检号,去河邊找鬼腌歉。 笑死蛙酪,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的翘盖。 我是一名探鬼主播桂塞,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼馍驯!你這毒婦竟也來了阁危?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤汰瘫,失蹤者是張志新(化名)和其女友劉穎狂打,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體混弥,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡趴乡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蝗拿。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晾捏。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖哀托,靈堂內(nèi)的尸體忽然破棺而出惦辛,到底是詐尸還是另有隱情,我是刑警寧澤仓手,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布胖齐,位于F島的核電站玻淑,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏市怎。R本人自食惡果不足惜岁忘,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望区匠。 院中可真熱鬧干像,春花似錦、人聲如沸驰弄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽戚篙。三九已至五鲫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間岔擂,已是汗流浹背位喂。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留乱灵,地道東北人塑崖。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像痛倚,于是被迫代替她去往敵國和親规婆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 大致的流程是使用Jenkins來進行持續(xù)構(gòu)建蝉稳,執(zhí)行OCLint來進行代碼分析抒蚜,然后將OCLint生成的分析報告?zhèn)鹘o...
    孫博士閱讀 2,596評論 0 7
  • 初識OCLint OCLint是一個靜態(tài)代碼分析工具,提高質(zhì)量和減少缺陷通過檢查C 、C++ 和Objective...
    這Er閱讀 14,367評論 97 61
  • 那是一汪沼澤 平靜的外表 有著魔鬼般的內(nèi)在 那是一汪沼澤 偶爾冒個泡 顯示出崢嶸的面貌 那是一汪沼澤 散發(fā)出淡香 ...
    含糖閱讀 365評論 0 0
  • 問題:一份表單調(diào)查問卷需要出現(xiàn)多個單選按鈕怎么實現(xiàn)耘戚? 答案:主要在于name的屬性值嗡髓,例如:第一個單選按鈕所屬的選...
    元氣靜靜的日常閱讀 1,103評論 0 0
  • 山徑拾紅葉, 信手兩行書收津。 遙望南歸雁饿这, 誰識白云初?
    文海觀心閱讀 185評論 0 0