Objective C静态代码扫描和代码质量管理 OClint + SonarQube

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 - http://oclint.org/downloads.html选择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

也可以在https://github.com/octo-technology/sonar-objective-c/tree/oclint 下载源码,并执行其中的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")

# 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 console
Running SonarQube...
wrapper  | --> Wrapper Started as Console
wrapper  | Launching a JVM...
jvm 1    | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
jvm 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 server
sonar.host.url=http://localhost:9000
#----- MySQL
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8
#----- Global database settings
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar

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

11. 测试OClint

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

12. 测试xcodebuild

$ xcodebuild -version
Xcode 5.0.2
Build 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-project
sonar.projectName=My project
sonar.projectVersion=1.0
sonar.language=objc

# Project description
sonar.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 application
sonar.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 code
sonar.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,pattern2
sonar.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 execution
ERROR: Unable to execute Sonar
ERROR: 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 execution
ERROR: Unable to execute Sonar
ERROR: 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

        <rule>
            <repositoryKey>OCLint</repositoryKey>
            <key>switch statements don‘t need default when fully covered</key>
        </rule>

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

switch statements don‘t need default when fully covered
----------

Summary:

Priority: 3
Severity: 3
Category: 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 Console
wrapper  | Launching a JVM...
jvm 1    | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
jvm 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

时间: 2024-12-15 05:47:17

Objective C静态代码扫描和代码质量管理 OClint + SonarQube的相关文章

jenkins 使用oclint 扫描 oc 代码

jenkins 环境的搭建,在这里不在赘述,下面我们写一写,如何接入oclint. OCLint是一个强大的静态代码分析工具,可以用来提高代码质量,查找潜在的bug,主要针对c,c++和Objective-c的静态分析.功能非常强大.项目地址:http://oclint.org/. 1.oclint 与 xcpretty的安装 推荐是用Homebrew 来安装,快速且节省精力,也可以选择源码安装或者release包来安装,不过需要配置环境变量的内容.使用Homebrew 安装时,需要先设置bre

静态分析——自动化代码扫描如何预防缺陷和加速交付?

一.什么是静态代码分析? 静态代码分析(简称静态分析)是一种必要的开发测试行为,通过扫描代码模式和结构以及分析逻辑关系,查找潜在缺陷代码,最终将报告呈现给用户以便修复代码缺陷.当高风险代码被侦测到后,静态分析扫描工具就会报告相应违规,指引用户修复代码漏洞.静态分析方法一般有如下一些类型: 模式匹配静态分析 模式匹配静态分析方法是静态分析的一种最简单形式,即根据预先配置的规则库去自动化进行代码扫描,如果发现规则库中匹配的模式代码即报告违规.例如,工程师们有时候不小心使用了字符串""进行字

Java 代码块,普通代码块,构造代码块,静态代码块

学习Java中… 刚刚学到了Java的代码块,虽然很简单 还是记下吧! 左音 2016-03-16 ----------------- // 执行优先级:静态代码块 > mian方法 > 构造代码块 > 构造方法 // 静态代码块不论是否实例化都会执行一次,不会重复执行 // 构造代码块实例化时执行 1.普通代码块 // 普通代码块在方法或语句中 1 public class CodeBlock { 2 3 public static void main (String[] args)

[ci] 基于1 上文实现拉取代码后能自动触发sonar-runner实现代码扫描评测,job1完成

基于1 上文实现拉取代码后能自动触发sonar-runner实现代码扫描评测,job1完成 ? 添加sonar插件 SonarQube Plugin ? 配置: 系统设置à告知jenkins,sonar在哪 ? https://docs.sonarqube.org/display/SONAR/User+Token How to Generate a Token To generate a token, to go?User > My Account > Security. Your exist

Jenkins集成openshift容器中进行代码扫描

1.Dockerfile sonarDockerfile: (基础slave镜像参考上篇博文) FROM registry.it.com/openshift/jenkins-slave:latest #tool maven ADD apache-maven-3.5.0.tar.gz /usr/local/ #tool sonar ADD sonar-scanner.tar.gz /usr/local/ 2.Jenkinsfile def label = "mypod-${UUID.randomU

Coverity代码扫描工具

1.说明:Coverity代码扫描工具可以扫描java,C/C++等语言,可以和jenkins联动,不过就是要收钱,jenkins上的插件可以用,免费的,适用于小的java项目 2.这是Coverity的github地址       https://github.com/jenkinsci/coverity-plugin 3.以下是coverity在jenkins上操作       jenkins=詹金斯 安装插件使用插件管理器,重启詹金斯. Coverity配置工具(管理詹金斯>全球工具配置)

后端阿里代码扫描

阿里代码扫描 idea Settings   Plugins   搜索  alibaba java coding duidelines(直接搜alibaba或者coding)   然后install ,重启idea 在tools下面会有一个阿里编码规约 点击到指定的类或文件夹  然后点击编码规约扫描  如果代码不规范  在下面就会有提示了 转载于:https://my.oschina.net/u/3559695/blog/1795226 原文地址:https://www.cnblogs.com/

20155326《网络对抗》免考项目—— 深入恶意代码之恶意代码详解

20155326<网络对抗>免考项目--深入恶意代码之恶意代码详解 什么是恶意代码 恶意代码是一种程序,它通过把代码在不被察觉的情况下镶嵌到另一段程序中,从而达到破坏被感染电脑数据.运行具有入侵性或破坏性的程序.破坏被感染电脑数据的安全性和完整性的目的. 恶意代码生命周期 攻击目标: 个人计算机 服务器 移动智能终端 手机.平板等 智能设备 特斯拉汽车.智能家居.智能手表等 通信设备 路由器.交换机等 安全设备等 防火墙.IDS, IPS. VDS 攻击目标范围: 定点攻击 邮件.IP.域名.

Android 优化代码代码写作习惯代码规整

今天我想说说代码习惯: 刚开始学Android时相信很多新手都会有一个疑问,我们作为菜鸟除了技术上的不足到底哪点比不上大神呢?相信问这个问题的新手,肯定是一个不服输的人(不能叫愤青吧,我认 为愤青貌似是个贬义词)所以喜欢问问题,但是一些经验丰富的大神有的时候就会说自己百度,不行谷歌,这么简单的问题还问!这可能深深的伤害到我们菜鸟,但挺多时候是应 该我们自己动手找自己研究,其实作为菜鸟不是不喜欢动手自己找自己写,只是想有个捷径站在巨人的肩膀上,但是事实却不是这样的因为所有的问题要想记得更牢固,更清