美文网首页iOS开发进阶随笔-生活工作点滴iOS开发记录
iOS自动化代码检查及持续集成(xcode+oclint+xcp

iOS自动化代码检查及持续集成(xcode+oclint+xcp

作者: 测试开发雨辰 | 来源:发表于2019-07-11 17:36 被阅读17次
    OCLint是什么?

    OCLint是一个静态代码分析工具,通过检查C,C ++和Objective-C代码并寻找潜在问题来提高质量和减少缺陷:

    • 如果/ else / try / catch / finally语句为空
    • 未使用的局部变量和参数
    • 高圈复杂度,NPath复杂度和高NCSS
    • 冗余if语句和无用的括号
    • 长方法和长参数列表
    • 倒置逻辑和参数重新分配
      ...
      总结:OCLint实现自动化审查代码规范,提升代码质量,帮助广大开发者节省CodeReview的人力~
    安装OClint工具
    1、Homebrew Tap

    重点讲述下Homebrew安装OCLint,不为什么,因为这个方法最快速简单~
    安装OCLint方法:

    $ brew tap oclint/formulae
    $ brew install oclint
    

    更新OClint方法:

    $ brew update
    $ brew upgrade oclint
    

    验证OClint成功安装

    $ oclint
    oclint: Not enough positional command line arguments specified!
    Must specify at least 1 positional arguments: See: oclint -help
    
    2、安装包安装
    • 进入oclint release下载页,下载最新版本安装包Source code(tar.gz)
    • 解压下载文件得到oclint-0.14文件,将文件放在某个目录下,如/User/XXX/OCLint
    • 打开终端编辑.bash_profile文件(先输入cd~,然后输入open -e .bash_profile,这时./bash_profile就会打开),将oclint添加到环境变量中,如下:
    OCLint_HOME=/User/XXX/OCLint/oclint-0.14
    export PATH=$OCLINT_HOME/bin:$PATH
    
    • 保存文件,关闭.bash_profile文件
    • 更新刚配置的环境变量:输入source .bash_profile,重启终端就可以执行oclint命令啦~
    3、编译源码安装

    这个就不详细多说了,大家可以看oclint官网说明

    xcobuild的安装

    这个只要下载Xcode工具,即可安装~

    xcpretty 的安装
    sudo gem install -n /usr/local/bin  xcpretty
    
    

    这里说下我遇到的Error问题:

     gem install xcpretty
     ERROR:  While executing gem ... (Gem::FilePermissionError)
        You don't have write permissions for the /Library/Ruby/Gems/2.3.0 directory.
    
    

    所以我换了sudo gem install -n /usr/local/bin xcpretty命令行,就解决了~

    OCLint + Xcode结合使用

    1、在工程中,创建一个新的Target,命令为OCLintTest~


    0CDCE218EA7B7376C50AD9DE9B826E31.png

    2、在OCLintTest上添加Run Script,如图:


    D5AB956BD47F4BB5D641674D06874332.png
    Xcode上Shell脚本,没有Pods的脚本编写代码:
    source ~/.bash_profile
    cd ${SRCROOT}
    xcodebuild clean
    xcodebuild build | tee xcodebuild.log | xcpretty -r json-compilation-database -o compile_commands.json
    oclint-json-compilation-database -- -report-type Xcode
    

    编译后的Xcode警告截图:


    DFB37F40C41B35476D75CA27E5AA6BDE.png
    OCLint+shell脚本结合使用
    #!/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"
    
    
    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} -UseModernBuildSystem=NO -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=("Pods")
    
    exclude=""
    for i in ${exclude_files[@]}; do
    exclude=${exclude}"-e "${i}" "
    done
    echo "排除目录:${exclude}"
    
    # 分析reportType =~判断子字符串包含关系
    if [[ ${reportType} =~ ${REPORT_PMD} ]]
    then
    nowReportType="-report-type html -o pmd.html"
    else
    nowReportType="-report-type Xcode"
    fi
    # 自定义report 如:
    # nowReportType="-report-type html -o oclint_result.html"
    
    echo "**************${nowReportType}"
    
    # 生成报表
    oclint-json-compilation-database ${exclude} -- \
    ${nowReportType} \
    -rc=LONG_CLASS=1500 \
    -rc=NESTED_BLOCK_DEPTH=5 \
    -rc=LONG_VARIABLE_NAME=80 \
    -rc=LONG_METHOD=200 \
    -rc=LONG_LINE=300 \
    -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.html ]
    then
    echo "-----分析失败-----"
    return -1
    else
    echo '-----分析完毕-----'
    return 0
    fi
    }
    
    # 替换workspace的名字
    myworkspace="OCLint.xcworkspace"
    # 替换scheme的名字
    myscheme="OCLint"
    # 输出方式 Xcode/pmd
    reportType="pmd"
    
    oclintForProject ${myworkspace} ${myscheme} ${reportType}
    

    以上就是完整的shell脚本,oclint.sh下载地址,用法:下载oclint.sh文件,拖到Xcode工程目录下,如图:

    5965A58FB5EE8844DF72D7333C01048D.png
    终端进入工程目录,执行命令行,就可以自动审查代码规范啦~
    ./oclint.sh
    

    执行后生成的html文件,打开界面如图:


    oclint report.png
    OCLint + Jenkins实现自动化审查代码规范

    一、在Jenkins的插件管理里面,下载PMD插件并安装
    二、Jenkins新建自由任务,如图:


    F80B7C4D8AD60FA74CCF68F6D0691A3F.png

    三、工程相关配置

    1、General

    这里我选的是github上我的一个项目,参数化构建过程我添加了Git Parameter的分支参数,用于选择构建的一个分支,如图:


    屏幕快照 2019-07-11 下午4.46.47.png
    2、源码管理

    这里我设置了git仓库地址以及自己的用户账号和密码,还有分支参数,如图所示:


    FDA6444B-6A5A-40E3-BD39-70CD27252243.png
    3、构建触发器

    我选的是定时构建~

    4、构建

    选择执行shell,shell里面代码与oclint.sh不同的地方就是:

    #这里是将xcpretty的安装路径导入到jenkins,为了解决xcpretty命令找不到的错误
    export PATH=$PATH:/usr/local/bin
    #拉取git工程
    git clean -df
    git fetch
    git reset --hard $GIT_BRANCH
    #代码修改为pmd格式的,因为展示在pmd插件上
    nowReportType="-report-type pmd -o pmd.html"
    #还有修改,查找文件路径地方也要做相应的修改
    project_path=$(pwd)
    cd "${project_path}/BaSiBuDeJie"
    echo "pwd === $(pwd)"
    # 替换workspace的名字
    myworkspace="BaSiBuDeJie.xcworkspace"
    # 替换scheme的名字
    myscheme="BaSiBuDeJie"
    # 输出方式 Xcode/pmd
    reportType="pmd"
    

    完整Jenkins-OCLint代码下载

    5、构建后操作

    构建后操作需要选上PMD的插件了,如图所示:


    6B0A4D8841569B2BB8410F11E96AA297.png
    6、Jenkins + OCLint结合操作后的效果图
    PMD Warning.png

    相关文章

      网友评论

        本文标题:iOS自动化代码检查及持续集成(xcode+oclint+xcp

        本文链接:https://www.haomeiwen.com/subject/wgerkctx.html