美文网首页CI/CD
Jenkins+oclint集成iOS代码静态分析

Jenkins+oclint集成iOS代码静态分析

作者: jayhe | 来源:发表于2019-03-14 17:28 被阅读0次

    OCLint
    fastlane
    xcpretty

    这里主要介绍jenkins+fastlane+oclint实现iOS的代码静态分析并生成PMB报告

    集成

    1.环境

    系统: os 10.14
    Xcode版本:Xcode 10

    2.安装oclint

    使用brew安装
    brew tap oclint/formulae
    brew install oclint

    安装完成之后可以在终端oclint --version看下是否安装成功

    3.编写oclint脚本

    OCLint大概的执行流程就是:

    1. Clean工程
    2. Clang编译工程生成log

    xcodebuild.log

    1. xcpretty转化log为json文件

    xcpretty -r json-compilation-database -o compile_commands.json

    1. oclint-json-compilation-database根据设置的规则分析生成报告
      脚本如下:
    #!/bin/bash -il
    source ~/.bashrc
    myworkspace=xxx.xcworkspace
    myscheme=xxx
    
    # clean cache
    rm -rf ~/Library/Developer/Xcode/DerivedData/;
    rm compile_commands.json;
    rm oclint_result.xml;
    
    # clean -- build -- OCLint analyse
    echo 'start analyse';
    xcodebuild -workspace $myworkspace -scheme $myscheme clean&&
    xcodebuild -workspace $myworkspace -scheme $myscheme \
    -configuration Debug GCC_PRECOMPILE_PREFIX_HEADER=YES CLANG_ENABLE_MODULE_DEBUGGING=NO COMPILER_INDEX_STORE_ENABLE=NO \
    -destination 'platform=iOS Simulator,name=iPhone X' \
    | xcpretty -r json-compilation-database -o compile_commands.json&&
    oclint-json-compilation-database -e Pods -e node_modules -- \
    -report-type pmd \
    -rc LONG_LINE=300 \
    -rc LONG_METHOD=200 \
    -rc LONG_VARIABLE_NAME=40 \
    -rc LONG_CLASS=3000 \
    -max-priority-1=1000 \
    -max-priority-2=1000 \
    -max-priority-3=2000 \
    -disable-rule=UnusedMethodParameter \
    -disable-rule=AvoidPrivateStaticMembers \
    -disable-rule=ShortVariableName \
    -allow-duplicated-violations=false >> oclint_result.xml; \
    echo 'end analyse';
    
    # echo result
    if [ -f ./oclint_result.xml ]; 
    then echo 'done';
    else echo 'failed';
    fi
    

    脚本分析

    • -e
      需要忽略分析的文件,这些文件的警告不会出现在报告中
    • -rc
      需要覆盖的规则的阀值,这里可以自定义项目的阀值,默认阀值
    • -enable-rule
      支持的规则,默认是oclint提供的都支持,可以组合-disable-rule来过滤掉一些规则
      规则列表
    • -disable-rule
      需要忽略的规则,根据项目需求设置
    • -report-type
      分析的报告的类型,支持[text、html、xml、json、pmd],差异可见对应Sample
      一般会选择可读性好的html或者pmd;这里我们选取pmd类型,用于结合PMD analysis生成PMD warnings,能比较友好的在Jenkins的看板中展示出来。

    执行分析

    打开终端,cd到oclint.sh所在的目录,执行

    chmod 777 oclint.sh && ./oclint.sh

    最终在同级目录下会生成compile_commands.jsonoclint_result.xml

    • compile_commands.json -- xcpretty将原始的xcodebuild.log转为json格式的json-compilation-database
    • oclint_result.xml--oclint生成的分析报告

    4.集成到Jenkins

    具体步骤如下:

    1. 创建一个job

    可创建一个自由风格的任务或者是Pipline

    1. 从远端仓库拉取代码 1552554585306.png
    2. 配置构建规则

      设置定时构建 1552546242878.png
    3. 执行构建脚本


      1552546337365.png

    添加一个执行shell的流程,将执行分析的脚本执行

    1. 构建完成生成pmd报告


      1552546801279.png
      1552553745900.png

    需要在Jenkins插件管理中安装PMD,这里提示废弃,Jenkins推荐使用`Warnings Next Generation Plugin;使用起来稍微麻烦点


    1552553776586.png
    1. 构建完成之后,发送通知
      根据需要选择邮件、钉钉或者其他的通知
    2. 执行立即构建
      构建成功后,在Jenkins面板的左侧选择PMD Warnings就能看到结果了
      使用PMD analysis
      1552553860546.png

    使用Warnings Next Generation Plugin

    1552553936208.png

    5.Q&A

    1. oclint: error: cannot open report output file

    在使用-o 输出oclint分析结果的时候,项目报以上错误
    这时候可以采用 >> 的方式将结果输出到文件中
    参照文档:https://github.com/oclint/oclint/issues/302

    1. oclint: error: one compiler command contains multiple jobs:

    在xcodebuild配置中加上编译选项 COMPILER_INDEX_STORE_ENABLE=NO

    1. warning: unable to open file xxx for serializing diagnostics (Too many open files in system) [-Wserialized-diagnostics]

    这个是由于mac系统默认一个用户同时打开的文件是256个,当我们分析的文件过多的时候就会报以上错误!
    参照文档:https://superuser.com/questions/433746/is-there-a-fix-for-the-too-many-open-files-in-system-error-on-os-x-10-7-1

    • 首先 修改 /etc/sysctl.conf,在其中写入以下参数【没有就新建一个,最好是在其他地方新建一个然后拷贝到这个目录,可能会有权限问题】
      kern.maxfiles:65536
      kern.maxfilesperproc:65536
    • 重启电脑,使其生效。【要重启,否则会提示-bash: ulimit: open files: cannot modify limit: Invalid argument
    • 在用户目录下的.bashrc中的末尾加入ulimit -n 65535
    • source ~/.bashrc 大功告成
    1. oclint: Not enough positional command line arguments specified
      Must specify at least 1 positional argument: See: /usr/local/bin/oclint -help
    • 确定oclint的环境路径是否是/usr/local/bin/oclint
    • 环境路径没有问题,那可能就是Xcode的缓存,在执行lint分析前删除掉DerivedData
      rm -rf ~/Library/Developer/Xcode/DerivedData/

    相关文章

      网友评论

        本文标题:Jenkins+oclint集成iOS代码静态分析

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