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就正吃劭郏】
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
效果:
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è)置
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
3.修改好后再次運行如上腳本 大概30分鐘時間,工程目錄下面多了如下分析文件oclint_result.html
二.jenkins+OClint 實現(xiàn)代碼靜態(tài)分析
1.效果如下 (首次啟動花時間用了44分鐘偏瓤,第二次就快了)
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修改)
# OCLint
cd ${WORKSPACE}
echo "-----分析${WORKSPACE}-----}"
bash $JENKINS_HOME/PMDOclint.sh
三.補充
參考
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
如果您發(fā)現(xiàn)本文對你有所幫助厅克,如果您認為其他人也可能受益赔退,請把它分享出去。