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

Mac环境搭建Jenkins+Sonar持续集成环境_第1张图片
Jenkins+Sonar.jpg

官方资料:
SonarQube
SonarSource Jira

一、准备工作:

  • 需要Ruby环境,如果不会安装,请参考Mac OS X上安装 Ruby运行环境

  • 安装HomeBrew

  • 安装OCLint(官网)

    brew tap oclint/formulae
    brew install oclint
    

如果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重新安装。

  • 在XCode使用OCLint

添加target,添加脚本:


Mac环境搭建Jenkins+Sonar持续集成环境_第2张图片
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

如果启动时提示:


Mac环境搭建Jenkins+Sonar持续集成环境_第3张图片
未安装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,参考如下:

Mac环境搭建Jenkins+Sonar持续集成环境_第4张图片
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查看上传报告

Mac环境搭建Jenkins+Sonar持续集成环境_第5张图片
1
Mac环境搭建Jenkins+Sonar持续集成环境_第6张图片
2
Mac环境搭建Jenkins+Sonar持续集成环境_第7张图片
3

六、安装Jenkins

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

brew install jenkins

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

Mac环境搭建Jenkins+Sonar持续集成环境_第8张图片
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页面也会看到如下提示:

Mac环境搭建Jenkins+Sonar持续集成环境_第9张图片
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持续集成环境)