Sonar+OC+Jenkins 静态代码扫描

一、安装

笔者遇到的问题:

  • 特别注意版本号,不同版本不兼容导致重装很多次

  • 注意Homebrew默认安装的插件是最新版

  • Sonar7.9+不再支持Mysql

  • Mysql8.0授权命令有更新

  • Sonar7.0需要使用低版本JDK

  • JDK1.8和JDK14同时安装了,Sonar启动时内部冲突,卸载JDK14

1.安装JDK1.8

https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html

2.安装Mysql5.7

https://dev.mysql.com/downloads/mysql/5.7.html

  • 创建sonar数据库和用户
mysql -u root -p
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其他简单命令
show databases;
show tables;
use 数据库名;
select user,host from user;
exit;

3.安装Sonar7.0

https://www.sonarqube.org/downloads/
解压到/usr/local/sonar/sonarqube-7.0/bin/...

4.安装sonar-runner2.4

https://repo1.maven.org/maven2/org/codehaus/sonar/runner/sonar-runner-dist/2.4/sonar-runner-dist-2.4.zip
解压到/usr/local/sonar-runner/bin/...

二、配置

1.配置环境变量

export PATH=/usr/local/bin:$PATH
export PATH=$PATH:/usr/local/sonar-runner/bin

export PATH=$PATH:/usr/local/mysql/bin
export PATH=$PATH:/usr/local/mysql/support-files

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
  • 使配置生效,执行:
#若终端提示命令找不到 not found **,执行:
source ~/.bash_profile

2.添加sonar配置:

  • 打开/usr/local/sonar/sonarqube-7.0/conf/sonar.properties添加以下
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
  • 打开/usr/local/sonar/sonarqube-7.0/conf/wrapper.conf修改以下
#修改可用内存大小,默认设置的值太小会导致server启动失败
wrapper.java.initmemory=2096
wrapper.java.maxmemory=20960

3.添加sonar-runner配置:

  • 打开/usr/local/sonar-runner/conf/sonar-runner.properties添加以下
sonar.host.url=http://localhost:9000
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar
sonar.sourceEncoding=UTF-8
sonar.login=admin
sonar.password=admin

4.修改mysql配置,设置更大内存和可一次性提交的包大小

  • 打开/usr/local/etc/my.cnf添加以下
[mysqld]
...
max_allowed_packet = 150M
innodb_log_file_size = 150994944
query_cache_type=1
query_cache_size=32M

5.设置关键文件读写权限:

原因:/usr/local/文件下默认只有root用户能修改,而sonar内的elasticsearch不能使用root用户运行,但是sonar要往log里写日志需要root权限。那么就将/usr/local/sonar改为普通用户等级。

cd /usr/local/sonar
ls -l
sudo chown -R [本机用户名] /usr/local/sonar
ls -l

三、运行

1.启动mysql服务

#修改了配置记得restart服务
mysql.server start

2.启动sonar服务

cd /usr/local/sonar/sonarqube-7.0/bin/macosx-universal-64
#修改了配置记得restart服务
sh sonar.sh start

注:sonar内的elasticsearch不能使用root用户运行,所以不能用 sudo sh sonar.sh start

3.打开 http://localhost:9000/ 校验是否成功启动sonar服务

若失败,则去/usr/local/sonar/sonarqube-7.0/logs/路径下查找报错日志,逐一解决

问题1:常见的数据库连接失败:

  • 检查mysql版本是否兼容sonar【sonar.properties注释有说明】
  • 是否成功创建了数据库和用户及授权
  • 端口号3306
  • mysql服务是否启动

问题2:elasticsearch不能使用root用户运行

  • 不使用sudo命令启动服务 sudo sh sonar.sh start
  • 修改sonar安装文件根目录用户权限,参见【二-5.设置关键文件读写权限】

四、项目配置

1.安装oc的插件

https://github.com/ChenTF/iOS-sonarShell/blob/master/sonar-objective-c-plugin-0.5.0-SNAPSHOT.jar
移动到插件文件夹下:/usr/local/sonar/sonarqube-7.0/extensions/plugins
重启sonar生效

2.使用Homebrew安装xcpretty、oclint、gcovr

gem install xcpretty
brew tap oclint/formulae
brew install oclint
brew install gcovr

3.创建项目配置文件sonar-project.properties,根据自己项目情况修改,保存到项目*.xocdeproj同级目录下

https://github.com/ChenTF/iOS-sonarShell/blob/master/sonar-project.properties

4.执行扫描脚本,解析结果,整理上传

#1.编译生成错误信息 并转化成json格式
xcodebuild clean -workspace "***.xcworkspace" -scheme "***" -sdk iphonesimulator  build | tee "./sonar/xcodebuild.log" | xcpretty -r json-compilation-database --output compile_commands.json

#2.oclint解析
oclint-json-compilation-database -- -max-priority-1 10000 -max-priority-2 10000 -max-priority-3 10000 -rc LONG_LINE=150 -report-type html -o oclint.xml

#3.上传到sonnar
sonar-runner

5.刷新http://localhost:9000/ 即可看到检查结果

五、Jenkins配置

上面提到的方案为手动执行扫描脚本,也可以利用CI可持续集成工具触发代码扫描,效率更高。

1.Jenkins安装插件SonarQube Scanner

2.Jenkins -> 系统管理 -> 系统配置:

SonarQube servers栏 设置Server URL=http://localhost:9000/ Server authentication token=(在http://localhost:9000/account/security/中生成token)

3.Jenkins -> 系统管理 -> 全局工具配置:

SonarQube Scanner栏 设置如图

image

4.在你的打包工程下添加构建步骤

image

5.配置项目,类似于sonar-project.properties的配置

image

6.开始Jenkins构建项目,成功后数据会自动上传到http://localhost:9000/

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