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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 225,337评论 6 524
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,560评论 3 406
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 172,632评论 0 370
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 61,219评论 1 303
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,219评论 6 401
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,670评论 1 316
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 42,018评论 3 431
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 41,000评论 0 280
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,552评论 1 326
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,565评论 3 347
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,692评论 1 355
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,280评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 43,009评论 3 341
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,435评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,587评论 1 277
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,276评论 3 383
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,752评论 2 367

推荐阅读更多精彩内容