美文网首页Autotest静态代码分析工具及框架程序员
Mac环境搭建Jenkins+Sonar持续集成环境

Mac环境搭建Jenkins+Sonar持续集成环境

作者: vincentgemini | 来源:发表于2018-02-12 21:37 被阅读150次
    Jenkins+Sonar.jpg

    官方资料:
    SonarQube
    SonarSource Jira

    一、准备工作:

    如果Updating Homebrew...卡住不动,可以临时关闭更新。

    export HOMEBREW_NO_AUTO_UPDATE=true
    

    另外可以修改HomeBrew的git。

    cd "$(brew --repo)"
    
    //二者选其一即可更新 
    //清华镜像源 
    git remote set-url origin git://mirrors.tuna.tsinghua.edu.cn/homebrew.git
    
    //中科大镜像源  
    git remote set-url origin http://mirrors.ustc.edu.cn/homebrew.git
    
    • 安装xcpretty

      sudo gem install xcpretty
      

    注意:出现Operation not permitted - /usr/bin/rougify,原因是gem版本低,如果用sudo gem update --system依然存在这个错误提示,建议用brew install ruby重新安装。

    添加target,添加脚本:


    OCLint

    OCLint规则加载选项

    • -R <目录>:指定规则加载的目录。可以是多个目录,用空格隔开,默认情况下会搜索 $(oclint 可执行文件目录)/../lib/oclint/rules。

    • -disable-rule <规则名> 通过规则名使某些验证规则失效。

    • -rc <参数>=<值> 修改某些阈值。

    如果遇到下面错误提示:

    Error: compile_commands.json not found at current location.

    找不到complie_commands.json文件,是因为使用xcpretty生成的文件名是:compilation_db.json,在目录build/reports目录中。

    因此需要把xcpretty生成的文件compilation_db.json复制到当前目录下。重命名为compile_commands.json。

    命令oclint-json-compilation-database:将complie_commands.json转换成其他格式,并定向输出。

    oclint-json-compilation-database -- -report-type xcode
    
    Report Type -report-type
    Plain Text Report text
    HTML Report html
    XML Report xml
    PMD Reporter pmd
    Xcode Reporter xcode
    oclint-json-compilation-database -- -report-type pmd -o oclint.xml
    

    常用规则

    参数 规则含义 默认值
    -rc=LONG_VARIABLE_NAME=20 变量最长值 20
    -rc=SHORT_VARIABLE_NAME=3 变量最短值 3
    -rc=CYCLOMATIC_COMPLEXITY=10 圈复杂度 10
    -rc=LONG_CLASS=1000 每个类行数 1000
    -rc=LONG_LINE=130 每行字节数量 100
    -rc=LONG_METHOD=150 每个方法行数 50
    -rc=NCSS_METHOD=130 忽略注释后括号后的有效代码行数 30
    -rc=NESTED_BLOCK_DEPTH=5 嵌套深度 5
    -rc=NPATH_COMPLEXITY=200 路径复杂度 200
    -rc=TOO_MANY_FIELDS=20 属性字段数量 20
    -rc=TOO_MANY_METHODS=30 方法数量 30
    -rc=TOO_MANY_PARAMETERS=10 方法参数 10
    • 安装JDK(Oracle官网)随便百度一下,很简单。

    二、安装SonarQube:

    下载SonarQube,解压后进入SonarQube文件夹,执行:

    ./bin/macosx-universal-64/sonar.sh start
    

    如果启动时提示:


    未安装JDK

    可能是JDK安装失败,重新安装即可。

    注意启动时,如果出现端口冲突,可以修改配置文件conf/sonar.properties,修改参数:

    sonar.web.host=127.0.0.1
    sonar.web.port=9000

    然后分别执行启动命令,打开http://127.0.0.1:9000,就可以正常进入sonar界面,此时会有红色提示,这是因为没有安装数据库。

    三、安装MySql

    brew install mysql
    

    (1)启动MySQL服务

    sudo /usr/local/MySQL/support-files/mysql.server start
    

    (2)停止MySQL服务

    sudo /usr/local/mysql/support-files/mysql.server stop
    

    (3)重启MySQL服务

    sudo /usr/local/mysql/support-files/mysql.server restart
    

    通过默认root用户登录mysql,mysql -uroot -proot,登录之后。
    需要新增sonar database以及sonar用户。

    CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci;
    CREATE USER 'sonar' IDENTIFIED BY 'sonar';
    GRANT ALL ON sonar.* TO 'sonar'@'%' IDENTIFIED BY 'sonar';
    GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar';
    FLUSH PRIVILEGES;

    成功之后,重启一下mysql服务。

    更改conf/sonar.properties数据库的配置,让它生效。

    sonar.jdbc.username=sonar
    sonar.jdbc.password=sonar
    sonar.login=admin
    sonar.password=admin
    sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance

    再重启一下sonar服务,然后重新登录.

    为了提高每次启动时不用输入长长的路径,可以把sonar添加到环境变量中,添加方法参考Mac 环境变量

    后来发现,每次重启电脑时,都不仅需要启动Sonar服务,还要启动Mysql服务,于是写了一个脚本,当然也可以把脚本作为启动项,这样连双击都省略了。

    #!/bin/zsh
    mysql.server restart
    sonar.sh restart
    echo 'OK' 
    

    四、Sonar-Runner(sonar-runner类似于一个发请求的命令,它应该放置于执行oclint的mac slave上)

    1、下载 sonar-runner

    2、将压缩包解压即可,然后可以设置一下环境变量,方法参考Mac 环境变量

    3、配置sonar-runner,打开sonar-runner/conf/sonar-runner.properties

    sonar.host.url=http://localhost:9007
    sonar.sourceEncoding=UTF-8
    sonar.login=admin  
    sonar.password=admin
    

    五、SonarQuber集成OC可视化报表

    1、下载 OC插件

    2、将sonar-objective-c-plugin-0.5.0-SNAPSHOT.jar拷贝到SonarQuber的sonar/extensions/plugins/,重启服务

    3、将sonar-project.properties放入iOS项目主目录,修改sonar-project.properties,参考如下:

    sonar-project.properties.png

    4、编写编译脚本如下:

    #!/bin/zsh
    
    xcodebuild clean
    xcodebuild | xcpretty -r json-compilation-database
    
    cp ./build/reports/compilation_db.json ./compile_commands.json
    
    oclint-json-compilation-database -- -report-type pmd -o oclint.xml
    
    sonar-runner
    

    Github上提供的脚本

    5、Web查看上传报告

    1 2 3

    六、安装Jenkins

    1、Jenkins官网
    2、使用brew安装jenkins:

    brew install jenkins
    

    3、安装时可能会提示如下错误:

    Screen Shot 2018-02-16 at 23.53.12.png

    按提示执行如下命令:

    brew cask install caskroom/versions/java8
    

    然后重新执行2命令

    brew install jenkins
    

    4、启动Jenkins

    Jenkins
    

    5、启动Jenkins时可能会看到控制台输出很多Java警告和错误,web页面也会看到如下提示:

    Screen Shot 2018-02-17 at 01.13.37.png

    这是由于安装了多个版本的JDK导致的,Jenkins需要使用Java8,在上面安装时已经提示过了。简单的做法是修改环境变量,将java8设为默认。

    export JAVA_9_HOME=/Library/Java/JavaVirtualMachines/jdk-9.0.4.jdk/Contents/Home
    export JAVA_8_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home
    export JAVA_HOME=$JAVA_8_HOME
    

    判断当前Java版本:

    java -version
    

    判断JDK路径:

    /usr/libexec/java_home -V
    

    以下为补充问题:

    2018年2月26日

    执行sonar-scanner时提示”

    The rule ‘XXX’ does not exist”

    这是因为在oclint在新版本版本会新增了些规则, 需要更新sonar服务器上对应的规则列表。
    先下载Sonar Plugin for Objective-C,然后后在路径:

    sonar-objective-c-develop/sonar-objective-c-plugin/src/main/resources/org/sonar/plugins/oclint

    下的profile-oclint.xml与rules.txt这两个文件,添加对应的规则。

    最后再执行 build-and-deploy.sh 编译出新的jar包。(这个脚本需要安装Maven)

    目前发现,编译后的jar无法在sonar上使用,正在寻求其他办法,也希望有办法的小伙伴,分享一下经验。


    2018年3月2日
    由于之前新版的jar包,不能正常使用,所以导致工作一直无法进展,知道今天无意当中跟一个Java朋友交流才知道,原来jar有点想oc中的bundle或者framew文件,属于一种封装格式,里面有资源文件、二进制文件,以及一个入口文件。所以,根据2018年2月26日在网上查找的结果来分析,其实如果只是修改xml文件,是没有必要重新编译的,只需要单独替换下这两个文件就可以了。于是,尝试通过替换xml的方式来修改jar。奇迹出现了,这种方式不仅可以正常时间插件,而且还可以分析新规则。

    jarfile=sonar-objective-c-plugin-0.5.0.jar
    
    unzip -x "$jarfile" -d "${jarfile}.tmp" 
    
    //注意下面命令要在临时目录中执行
    zip -ru "../$jarfile" * 
    

    不过,仍然没有搞清楚为什么新编的插件不能使用,表面上分析,新编的jar和老的jar包结构不通,所以sonar无法识别。再往深思考一下,可能新的jar使用的是sonar其他版本接口方式做的,在我当前版本不能使用。当然,还有一种可能,就是新插件需要在sonar上怎么某些设置才能正常使用。

    所以,希望使用新插件的小伙伴分享下自己的使用方法。


    2018年3月29日

    oclint: error: one compiler command contains multiple jobs:
    

    解决办法:

    1. 如果电脑里面安装了两个Xcode的话可能会报上面错误,删掉其他只剩一个
    2. xcode9以后(OCLint version 0.13, Version 9.2 beta (9C34b) 测试可用):

    2.1 更新到最新的oclint, brew upgrade oclint
    2.2 去github下载最新的oclint.sh,替换掉旧的

    1. 试试手动将 工程=> Build Settings => 搜索COMPILER_INDEX_STORE_ENABLE 该配置设成NO

    参考1:Sonar环境搭建
    参考2:XCode8兼容问题
    参考3:iOS 持续集成系列 - 自动化 Code Review
    参考4:Jenkins
    参考5: 一步步编写SonarQube Plugin

    相关文章

      网友评论

        本文标题:Mac环境搭建Jenkins+Sonar持续集成环境

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