Sonarqube & ObjectiveC 环境搭建

前言

团队开发中,代码质量的把关,往往决定了一个团队的开发维护效率。成员的增长,业务的扩大,不同风格、不严谨的代码,直接导致后续维护的高成本。
每个团队都有自己的一套代码检查方式。对于小团队,也有很多高效可扩展的开源工具。结合自己的实践,介绍下一种解决方案:sonarqube + gerrit + Jenkins。
本篇介绍Mac上sonarqube的安装,以及添加开源plugin对objective c支持。环境配置比较多,文字较长...

所需安装工具一览
  • homebrew
  • Java JDK (推荐jdk而不是jre,最新的即可)
  • maven
  • xcode
  • xcpretty
  • sonarqube
  • sonar-scanner
  • oclint
  • SonarQube Plugin for Objective C

注: 安装顺序推荐如上排序。建议先阅读下文,了解各工具作用后再进行安装

sonarqube 安装与使用

SonarQube® software (previously called Sonar) is an open source quality management platform, dedicated to continuously analyze and measure technical quality, from project portfolio to method. If you wish to extend the SonarQube platform with open source plugins, have a look at our plugin library.

1. 环境要求(具体见官网)
*   at least 2GB of RAM to run efficiently and 1GB of free RAM for the OS
*   disk space you need will depend on how much code you analyze
*   Database: [MySQL](http://www.mysql.com/)
*   Web Browser
2. 安装sonarqube
  • download Download Page
  • Unzip & execute: sonar.sh console(解压后目录里有系统对应脚本)
# 主要命令一览, 建议添加alias到~/.bash_profile
./sonar.sh console #Debug信息
./sonar.sh start #启动服务
./sonar.sh stop #停止服务
./sonar.sh restart #重启服务
  • Log in to http://localhost:9000 & 默认登录/密码: admin/admin
  • follow the tutorial to analyze your first project (无法添加project,需要安装数据库和scanner)
  • 汉化方式:setting->market->搜Chinese
3. 安装 & 配置数据库(这里使用MySQL)

sonarqube内嵌有数据库,但不能有额外操作,所以需要另外添加数据库

# 直接使用homebrew,homebrew安装方式请自查
brew install mysql #安装
mysql.server start #启动
mysql_secure_installation #基本配置
brew services start mysql #配置为系统服务

mysql管理gui,optional:

配置sonar的用户和数据库实例:

  • 创建sonar用户和数据库sonar,赋予sonar权限
mysql -u root -p #进入MySQL, root默认密码为空
CREATE DATABASE sonar;
CREATE USER 'sonar'@'localhost' IDENTIFIED BY '你要设置的密码’;
GRANT ALL PRIVILEGES ON sonar_qube.* TO 'sonar'@'localhost’;
FLUSH PRIVILEGES;

修改sonarqube数据库配置

  • 到sonarquebe目录配置\conf\sonar.properties中数据库设置,原文件相应行被注释
sonar.jdbc.username=sonar
sonar.jdbc.password=你要设置的密码
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar_qube?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
  • restart sonarqube server,正常启动,且不再有内嵌数据库提示
4. 安装sonar-scanner & 配置

The SonarQube Scanner is recommended as the default launcher to analyze a project with SonarQube.

  • Installation
  • 解压到安装目录,推荐添加bin目录路径到$PATH
export PATH=`pwd`/bin:$PATH >> ~/.bash_profile  # 或直接copy bin路径到~/.bash_profile
  • 配置安装目录下的sonar-scanner.properties & 添加host.url
sonar.host.url=http://localhost:9000

对需检测project执行scanner命令
到project所在目录,添加sonar-project.properties(注意命名不要错😪)。添加project相关信息sonar-project.properties中,例如

sonar.projectKey=testOC #projectKey required
sonar.sources=/Users/hotacool/dev/RACTest #project source required
sonar.projectName=test OC #server 展示名字
sonar.projectVersion=1.0 # version

在该工程sonar-project.properties所在目录下,执行sonar-scanner,进行扫描
打开server(http://localhost:9000/projects),可以看到projects扫描结果

5. oclint 安装 & 使用

sonarqube对objectivec的代码检测,需要依赖oclint对xcode工程的编译log的分析结果。简单说下过程,对xcode工程进行xcodebuild,输出编译log,oclint对编译log进行分析,输出xml,sonarqube根据xml来显示可视化结果。
OCLint is a static code analysis tool for improving quality and reducing defects by inspecting C, C++ and Objective-C code and looking for potential problems.

  • 安装方式见官网。
    • Homebrew 简单,但可能外网连不上
    • 推荐直接download包,解压执行文件路径加入$PATH
  • 安装完毕,终端执行oclint
    • xcodebuild | tee xcodebuild.log | xcpretty -r json-compilation-database
    • 编译工程并输出log,格式化log为json文件
    • Xcodebuild 指令需要添加编译相关参数
xcodebuild archive -workspace 项目名称.xcworkspace 
                       -scheme 项目名称 
                       -configuration 构建配置 
                       -archivePath archive包存储路径 
                       CODE_SIGN_IDENTITY=证书 
                       PROVISIONING_PROFILE=描述文件UUID
  • oclint的执行,需要依赖xcpretty
  • Xcpretty 是编译log format工具,直接gem安装
sudo gem install xcpretty
  • -r json-compilation-database 制定的数据的输出格式为json格式。输出的数据为build/reports/compilation_db.json
  • 使用oclint时需要将build/reports/compilation_db.json 重新命名为 compile_commands.json 并移动至当前目录(工程文件目录),执行:
oclint-json-compilation-database -- -report-type pmd -o oclint.xml #输出xml
oclint-json-compilation-database -e Pods -v -- -report-type html -o report.html #输出HTML,oclint使用xml
6. SonarQube Plugin for Objective C
  • Sonarqube market有收费plugin可供安装,but,感受一下:


    image.png
  • 选用开源https://github.com/Backelite/sonar-objective-c(还在保持更新的),不过可能存在一些坑,需要自填。笔者fork了一下,更新了一下rule:Hotacool/sonar-objective-c。下面以Backelite为例:
    • github download sonar-objective-c,unzip
    • Java代码,需要maven来编译jar包,安装maven:
    brew install maven
    
    • sonar-objective-c 目录(pom.xml所在目录)编译:
    mvn package
    
    • /sonar-objective-c-plugin/target 目录下输出backelite-sonar-objective-c-plugin-0.6.2.jar
    • Copy jar包到sonarqube安装目录下的/extensions/plugins文件夹
    • 修改project的sonar-project.properties(参照sonar-objective-c-plugin的/sample/sonar-project.properties)
    sonar.objectivec.oclint.report=oclint.xml
    sonar.objectivec.project=myApp.xcodeproj
    sonar.objectivec.appScheme=myApp
    sonar.objectivec.excludedPathsFromCoverage=.*Tests.*
    
    • 重启sonarqube server & 重新运行sonar-scanner
    • 在server上可看到objectivec代码被检查,bingo~
    • 可能存在问题:
      • ERROR: The rule 'OCLint:compiler warning' does not exist.
      • 原因是开源的sonar-objective-c plugin没有包含这条rule,而oclint检出了这个问题。几种解决方案:
        • oclint.xml 去掉相关报错
        • 修改sonar-objective-c plugin,添加rule并打包—推荐
          • 实际上,rule文件被存放在/sonar-objective-c-plugin/src/main/resources/org/sonar/plugins/oclint文件夹下,包含两个文件:profile-oclint.xml 和 rules.txt
          • 参照其他rule,添加compiler warning即可
          • 重新打jar包、替换、重启server 、 sonar-scanner...

参考链接:

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

推荐阅读更多精彩内容

  • 官方资料:SonarQubeSonarSource Jira 一、准备工作: 需要Ruby环境,如果不会安装,请参...
    vincentgemini阅读 2,367评论 3 7
  • 一、前言 年初的时候部门各组都给出了自己的规范文档,包括部门工作规范、各语言开发规范、测试规范、数据库规范、安全规...
    dancingking阅读 15,112评论 8 20
  • 1.SonarQube Sonar的功能:是一个用于代码质量管理的开源平台,用于管理源代码的质量,可以从七个维度检...
    Broom阅读 9,389评论 0 6
  • 我时常享受一种状态,渴望黄昏下的美景,天边的晚霞,夕阳西下的余晖,马路上树的斜影,耳边有风的抚摸,一朵飘零的雪花亲...
    Nan瑾瑜阅读 310评论 7 4
  • 1 早晨起床时,发现我的睡眠状态非常好,精力在很好地恢复,看来昨天做的粥,很对症,感恩! 2 下班回家,在小区里...
    LiHongxi阅读 147评论 0 0