官方资料:
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,添加脚本:
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安装失败,重新安装即可。
注意启动时,如果出现端口冲突,可以修改配置文件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,参考如下:
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查看上传报告
六、安装Jenkins
1、Jenkins官网
2、使用brew安装jenkins:
brew install jenkins
3、安装时可能会提示如下错误:
按提示执行如下命令:
brew cask install caskroom/versions/java8
然后重新执行2命令
brew install jenkins
4、启动Jenkins
Jenkins
5、启动Jenkins时可能会看到控制台输出很多Java警告和错误,web页面也会看到如下提示:
这是由于安装了多个版本的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:
解决办法:
- 如果电脑里面安装了两个Xcode的话可能会报上面错误,删掉其他只剩一个
- xcode9以后(OCLint version 0.13, Version 9.2 beta (9C34b) 测试可用):
2.1 更新到最新的oclint
, brew upgrade oclint
2.2 去github下载最新的oclint.sh,替换掉旧的
- 试试手动将 工程=>
Build Settings
=> 搜索COMPILER_INDEX_STORE_ENABLE
该配置设成NO
参考1:Sonar环境搭建
参考2:XCode8兼容问题
参考3:iOS 持续集成系列 - 自动化 Code Review
参考4:Jenkins
参考5: 一步步编写SonarQube Plugin