Jenkins持续集成打包(二)

最近在新入职的公司又开始弄Jenkins自动化构建环境,这篇文章将会记录一些Jenkins的其他用法,包括OCLint静态代码检查、参数化构建和构建后的操作等内容。

1、静态代码检查

首先要安装OCLint和其他插件工具

brew tap oclint/formulae 
brew install oclint
gem install xcpretty

在安装xcpretty时如果报错:ERROR: While executing gem … (Gem::FilePermissionError)
则使用如下命令:

sudo gem install -n /usr/local/bin xcpretty

其次要在Jenkins插件管理中安装必要的插件

DRY相关插件
PMD相关插件

oclint.sh脚本文件内容如下:

#!/bin/bash

# 指定编码
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=

function checkDepend () {
command -v xcpretty >/dev/null 2>&1 || {
echo >&2 "I require xcpretty but it's not installed.  Install:gem install xcpretty";
exit
}
command -v oclint-json-compilation-database >/dev/null 2>&1 || {
echo >&2 "I require oclint-json-compilation-database but it's not installed.  Install:brew install oclint";
exit
}
}

function oclintForProject () {

# 检测依赖
checkDepend

projectName=$1
scheme=$2
reportType=$3

REPORT_PMD="pmd"
REPORT_XCODE="xcode"

myworkspace=${projectName}
myscheme=${scheme}
echo "myworkspace是:${myworkspace}"
echo "myscheme是:${myscheme}"
echo "reportType为:${reportType}"

# 清除上次编译数据
if [ -d ./build/derivedData ]; then
echo '-----清除上次编译数据derivedData-----'
rm -rf ./build/derivedData
fi

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

echo '-----开始编译-----'

# 生成编译数据
xcodebuild -workspace ${myworkspace} -scheme ${myscheme} -sdk iphonesimulator -derivedDataPath ./build/derivedData -configuration Debug COMPILER_INDEX_STORE_ENABLE=NO | xcpretty -r json-compilation-database -o compile_commands.json


if [ -f ./compile_commands.json ]
then
echo '-----编译数据生成完毕-----'
else
echo "-----生成编译数据失败-----"
return -1
fi

echo '-----分析中-----'

# 自定义排除警告的目录,将目录字符串加到数组里面
# 转化为:-e Debug.m -e Port.m -e Test
exclude_files=("cardloan_js" "Pods" "ios")

exclude=""
for i in ${exclude_files[@]}; do
exclude=${exclude}"-e "${i}" "
done
echo "排除目录:${exclude}"

# 分析reportType
if [[ ${reportType} =~ ${REPORT_PMD} ]]
then
nowReportType="-report-type pmd -o pmd.xml"
else
nowReportType="-report-type xcode"
fi
# 自定义report 如:
#nowReportType="-report-type html -o oclint_result.html"

# 生成报表
oclint-json-compilation-database ${exclude} -- \
${nowReportType} \
-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

rm compile_commands.json
if [[ ${reportType} =~ ${REPORT_PMD} ]] && [ ! -f ./pmd.xml ]
then
echo "-----分析失败-----"
return -1
else
echo '-----分析完毕-----'
return 0
fi
}

# 替换workspace的名字
myworkspace="HsbAutocheckTool.xcworkspace"
# 替换scheme的名字
myscheme="HsbAutocheckTool"
# 输出方式 xcode/pmd/html
reportType="pmd"

oclintForProject ${myworkspace} ${myscheme} ${reportType}

2、参数化构建

Jenkins持续集成打包(二)_第1张图片

设置要构建的分支为上图填写的参数
Jenkins持续集成打包(二)_第2张图片

补充:Git 超时设置,git fetch 默认时限是10分钟,如果项目过大,会导致超时构造失败,可在下图中修改超时时间。

Jenkins持续集成打包(二)_第3张图片

最后是 “执行shell” 的配置:

#bin/bsah - l
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
export LC_ALL=en_US.UTF-8

#安装Pod库
cd $WORKSPACE/HsbAutocheckTool
/usr/local/bin/pod update --verbose --no-repo-update

#自动打包脚本
cd $WORKSPACE/HsbAutocheckTool
cd HSBAutoPackageScript
sh HSBAutoPackageScript.sh 3

#OCLint脚本
jobPath=${JENKINS_HOME}/workspace/${JOB_NAME}
projectPath=$jobPath/HsbAutocheckTool
workspacePath=$projectPath/HSBAutoPackageScript/oclint.sh
cd ${projectPath}
echo "--------------分析${workspacePath}----------------"
bash $workspacePath

#检测重复代码脚本
export HEAPSIZE=4096m
~/PMD/pmd-bin-6.9.0/bin/run.sh cpd --minimum-tokens 100  --format xml --language ObjectiveC --encoding UTF-8 --files HsbAutocheckTool --skip-duplicate-files > cpd.xml || exit 0

3、构建后操作,配置OCLint静态代码检查生成的xml数据路径,pmd.xml和cpd.xml这两个文件默认会在项目根目录下

Jenkins持续集成打包(二)_第4张图片

静态代码检查效果:

Jenkins持续集成打包(二)_第5张图片

最后附上自动打包的shell脚本,这个脚本是基于一个开源的脚本修改的,我已经放到了Github上:

下载自动打包脚本:https://github.com/yaoliangjun/HSBAutomation.git

你可能感兴趣的:(Jenkins自动化打包)