博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Objective C静态代码扫描和代码质量管理 OClint + SonarQube
阅读量:6123 次
发布时间:2019-06-21

本文共 7003 字,大约阅读时间需要 23 分钟。

hot3.png

OClint是针对C, C++及Objective C代码的静态扫描分析工具,而SonarQube是一个开源的代码质量管理平台。本文将实现将OClint的扫描结果导入到SonarQube中,已实现对Objective C代码质量的管理。

操作系统:

Mac OS X 10.9

所需工具:

  1. SonarQube : sonarqube-4.4 - http://www.sonarqube.org/downloads/

  2. Sonar Runner : sonar-runner-dist-2.4 - http://www.sonarqube.org/downloads/

  3. MySQL 5.x : 5.0.90 MySQL Community Server (GPL) - http://dev.mysql.com/downloads/mysql/

  4. OClint : oclint-0.9.dev.5f3418c - 选择mac os x或者darwin的包

  5. xcodebuild: Xcode 5.x - https://developer.apple.com/xcode/downloads/

所需组件:

Sonar Plugin for Objective C

可以直接下载sonar-objective-c-plugin-0.3.2-SNAPSHOT.jar

也可以在 下载源码,并执行其中的build-and-deploy.sh编译

环境搭建:

  1. 下载并安装MySQL;

  2. 创建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;

复制代码

3. 下载并解压SonarQube (例如:"/etc/sonarqube")

4. 将sonar-objective-c-plugin-0.3.2-SNAPSHOT.jar放到SonarQube的扩展插件目录下 (例如:"/etc/sonarqube/extensions/plugins")

5. 配置sonar.properties (例如:"/etc/sonarqube/conf")

1
2
3
4
5
6
7
# H2 embedded database server listening port, defaults to 
9092
#sonar.embeddedDatabase.port=
9092
 
 
#----- MySQL 
5
.x
# Comment the embedded database and uncomment the following line to use MySQL
sonar.jdbc.url=jdbc:mysql:
//localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true

6. 启动SonarQube服务器

复制代码

$ /etc/sonarqube/bin/macosx-universal-64/sonar.sh consoleRunning SonarQube...wrapper  | --> Wrapper Started as Consolewrapper  | Launching a JVM...jvm 1    | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.orgjvm 1    |   Copyright 1999-2006 Tanuki Software, Inc.  All Rights Reserved.jvm 1    | jvm 1    | 2014.09.06 14:45:53 INFO  Web server is started

复制代码

7. 测试SonarQube

http://localhost:9000/

8. 下载并解压Sonar Runner (例如:"/etc/sonar-runner")

9. 配置Sonar Runner下的sonar-runner.properties (例如:"/etc/sonar-runner/conf/ sonar-runner.properties")

复制代码

#----- Default SonarQube serversonar.host.url=http://localhost:9000#----- MySQLsonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8#----- Global database settingssonar.jdbc.username=sonarsonar.jdbc.password=sonar

复制代码

10. 下载并解压OClint(例如:"/etc/oclint")

11. 测试OClint

$ /etc/oclint/bin/oclintoclint: Not enough positional command line arguments specified!Must specify at least 1 positional arguments: See: oclint -help

12. 测试xcodebuild

$ xcodebuild -versionXcode 5.0.2Build version 5A3005

扫描代码:

  1. 在bash中进入代码目录(.xcodeproj文件所在目录), 执行 xcodebuild | tee xcodebuild.log

  2. 在bash中执行 oclint-xcodebuild xcodebuild.log

  3. 在bash中执行oclint-json-compilation-database -- -report-type pmd -o sonar-reports/oclint.xml。

  4. 将sonar-project.properties存放到代码目录中,根据具体情况编辑对应的项,需要特别注意其中的sonar.objectivec.project和sonar.objectivec.appScheme

复制代码

########################### Required configuration ###########################sonar.projectKey=my-projectsonar.projectName=My projectsonar.projectVersion=1.0sonar.language=objc # Project descriptionsonar.projectDescription=Fake description # Path to source directories sonar.sources=srcDir1,srcDir2 # Xcode project configuration (.xcodeproj or .xcworkspace)# -> If you have a project: configure only sonar.objectivec.project# -> If you have a workspace: configure sonar.objectivec.workspace and sonar.objectivec.project# and use the later to specify which project(s) to include in the analysis (comma separated list)sonar.objectivec.project=myApplication.xcodeproj # sonar.objectivec.workspace=myApplication.xcworkspace# Scheme to build your applicationsonar.objectivec.appScheme=myApplication# Scheme to build and run your tests (comment following line of you don't have any tests)sonar.objectivec.testScheme=myApplicationTests ########################### Optional configuration ############################ Encoding of the source codesonar.sourceEncoding=UTF-8# JUnit report generated by run-sonar.sh is stored in sonar-reports/TEST-report.xml# Change it only if you generate the file on your own# The XML files have to be prefixed by TEST- otherwise they are not processed # sonar.junit.reportsPath=sonar-reports/# Cobertura report generated by run-sonar.sh is stored in sonar-reports/coverage.xml# Change it only if you generate the file on your own# sonar.objectivec.coverage.reportPattern=sonar-reports/coverage*.xml# OCLint report generated by run-sonar.sh is stored in sonar-reports/oclint.xml# Change it only if you generate the file on your own# sonar.objectivec.oclint.report=sonar-reports/oclint.xml# Paths to exclude from coverage report (tests, 3rd party libraries etc.)# sonar.objectivec.excludedPathsFromCoverage=pattern1,pattern2sonar.objectivec.excludedPathsFromCoverage=.*Tests.*

复制代码

6. 在bash中执行Sonar Runner

/etc/sonar-runner/bin/sonar-runer.sh

7. 在SonarQube中查看结果

http://localhost:9000/

异常情况处理:

  1. 如果执行/etc/sonar-runner/bin/sonar-runer.sh 失败,提示错误:

复制代码

RROR: Error during Sonar runner executionERROR: Unable to execute SonarERROR: Caused by: You must install a plugin that supports the language 'objc'ERROR: ERROR: To see the full stack trace of the errors, re-run SonarQube Runner with the -e switch.ERROR: Re-run SonarQube Runner using the -X switch to enable full debug logging.

复制代码

说明sonar-objective-c-plugin-0.3.2-SNAPSHOT.jar没有加载到/etc/sonarqube/extensions/plugins

2. 如果执行/etc/sonar-runner/bin/sonar-runer.sh 失败,提示错误:

复制代码

ERROR: Error during Sonar runner executionERROR: Unable to execute SonarERROR: Caused by: The rule 'OCLint:switch statements don't need default when fully covered' does not exist.ERROR: ERROR: To see the full stack trace of the errors, re-run SonarQube Runner with the -e switch.ERROR: Re-run SonarQube Runner using the -X switch to enable full debug logging.

复制代码

错误提示 The rule ‘XXX’ does not exist说明Oclint扫描出来的问题在Sonar Plugin for Objective C(sonar-objective-c-plugin-0.3.2-SNAPSHOT.jar)的规则定义中不存在,这时候只能把规则追加到Sonar Plugin for Objective C中,并重新编译jar包。追加规则的方法为:

编辑sonar-objective-c-master/src/main/resources/org/sonar/plugins/oclint下的 profile-oclint.xml和rules.txt

例如上面的错误,将下面的代码加入profile-oclint.xml

        
            
OCLint
            
switch statements don't need default when fully covered
        

将下面的代码加入rules.txt(注意在0.3.2版本中Priority和Severity不能超过3,否则编译出来的jar包会造成SonarQube服务器无法启动)

复制代码

switch statements don't need default when fully covered----------Summary:Priority: 3Severity: 3Category: OCLint

复制代码

最后需要重启SonarQube服务器

/etc/sonarqube/bin/macosx-universal-64/sonar.sh restart

3. 如果执行/etc/sonarqube/bin/macosx-universal-64/sonar.sh console失败,提示错误:

复制代码

wrapper  | --> Wrapper Started as Consolewrapper  | Launching a JVM...jvm 1    | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.orgjvm 1    |   Copyright 1999-2006 Tanuki Software, Inc.  All Rights Reserved.jvm 1    | wrapper  | <-- Wrapper Stopped

复制代码

同时在/etc/sonarqube/bin/macosx-universal-64/中生成wrapper.log文件,并提示无法找到配置文件,则由可能是追击规则后重新编译过的sonar-objective-c-plugin-0.3.2-SNAPSHOT.jar文件出错,特别是rules.txt 中某一项的Priority和Severity超过了3

转载于:https://my.oschina.net/rareliu/blog/510868

你可能感兴趣的文章
软件概要设计做什么,怎么做
查看>>
dwr
查看>>
java的特殊符号
查看>>
word2010中去掉红色波浪线的方法
查看>>
fabric上下文管理器(context mangers)
查看>>
JQuery-EasyUI Datagrid数据行鼠标悬停/离开事件(onMouseOver/onMouseOut)
查看>>
并发和并行的区别
查看>>
php小知识
查看>>
Windows下安装、运行Lua
查看>>
Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解(二)
查看>>
初识中间件之消息队列
查看>>
MyBatis学习总结(三)——优化MyBatis配置文件中的配置
查看>>
Spring常用注解
查看>>
我的友情链接
查看>>
PCS子层有什么用?
查看>>
查看端口,关闭端口
查看>>
代码托管平台简介
查看>>
linux:yum和apt-get的区别
查看>>
Sentinel 1.5.0 正式发布,引入 Reactive 支持
查看>>
如何对网站进行归档
查看>>