简介

Jenkins

Jenkins是一款开源的持续集成工具,它的特点:易于安装、易于配置、可扩展(自己开发插件),并且它拥有数以百计的成熟插件,这种插件式的特点提供可做任何事情的可能。

Sonarqube

SonarQube 是一个用于代码质量管理的开源平台。通过插件形式,可以支持包括 java, Objective-C, Swift, C#, C/C++, PL/SQL,Java 等等二十几种编程语言的代码质量管理与检测。

SonarQueb主要从以下7个维度检测评估代码质量:

1. 糟糕的复杂度分布

2. 重复

3. 缺乏单元测试

4. 没有代码标准

5. 没有足够的或者过多的注释

6. 潜在的bug

7. 糟糕的设计(原文Spaghetti Design,意大利面式设计)

安装

jenkins

  1. brew install jenkins
  2. 按提示安装java 1.8
  3. brew services jenkins start or jenkins –httpPort=9002
  4. 安装相关插件

注意事项

gitlab plugin 1.5.3有问题,需要降级到1.5.1

卸妆1.5.3,然后通过上传1.5.1的gitlab-plugin.hpi文件的方式安装

jenkins默认使用8080端口,默认端口跟gitlab ci配置web hook会导致失败,建议换个端口尝试:

Sonarqube

下载

从http://downloads.sonarsource.com/sonarqube/下载sonarqube,下载后解压到相应地址,比如/opt

配置环境变量

配置SONAR_HOME环境变量,如上一步中的/opt/sonarqube

mysql建库

sonarqube需要将扫描结果保存到数据库中,所以需要创建数据库表格。sonarqube支持SQL Server、Mysql、Oracle、PostgreSQL,此处以MySql为例。

如果尚未安装mysql,可以通过Homebrew进行安装,安装完成后,创建对应的账号和数据库:

通过以上指令创建了一个sonar用户,同时创建了一个名为sonar的数据库。

修改/opt/sonarqube/conf/sonar.properties文件,将相关属性按如下设置:

start sonarqube

download sonar scanner

https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner

objective-c plugin

github: https://github.com/Backelite/sonar-objective-c

clone后进入主目录, 执行脚本:./build-and-deploy.sh

把编译生成的backelite-sonar-objective-c-plugin-0.6.2.jar文件拷贝到/opt/sonarqube/extensions/plugins目录。

最后重启Sonarqube

Prerequisites

Installation of xcpretty with JUnit reports fix

git clone https://github.com/Backelite/xcpretty.git

cd xcpretty

git checkout fix/duration_of_failed_tests_workaround

gem build xcpretty.gemspec

sudo gem install --both xcpretty-0.2.2.gem

install xctool

brew install xctool

install oclint

brew tap oclint/formulaebrew install oclint

install gcovr

brew install gcovr

install slather

gem install slather

sudo gem update --system

sudo gem install /usr/local/bin slather

install lizard

sudo pip install lizard

chmod +x get-pip.py

sudo python get-pip.py

演示一个示例代码工程的例子

代码工程的配置

sonar-project.properties

下载上面sonar-objective-c github工程sample目录下的sonar-project.properties文件,拷贝到示例代码工程目录,按照对应的设置进行修改

run-sonar.sh

拷贝该文件到代码工程目录

jenkins配置

在管理jenkins->系统设置->gitlab下配置gitlab连接

在Gitlab host url处设置gitlab的url,然后在creadential处点击add。

创建一个Gitlab API token,然后在API token处填入gitlab上的token:

创建工程

构建一个自由风格的软件项目,然后在源码管理处,选择git,然后进行如下配置:

在Repository URL处填入对应工程的URL,注意,因为后续工程check是通过ssh方式接入的,所以填写的URL一定是ssh URL:

然后在Branch Specifier处填入要关注的分支。

然后在Credentials处点击add,配置ssh秘钥:

选择SSH Username with private key,然后在username处填入gitlab账号,然后private key可以选择Enter directly,直接输入秘钥,将~/.ssh/id_rsa文件中的内容直接拷贝即可。注意,此处必须保证该私钥对应的公钥(即 id_rsa.pub)必须配置在gitlab上,否则会失败, 配置完成后点击Add。

然后在Credentials处选择刚才创建的credential即可,如果配置成功不会有报错信息,否则会有相关的错误信息。

其他的配置可以根据实际情况进行配置,配置完成后点击保存即创建完成。

配置SonarQube servers

在管理jenkins->全局配置页面下,找到SonarQube servers,配置sonarqube server相关信息:

其中Server authentication token可在SonarQube网站,个人账号管理下的security处进行生成:

增加SonarScanner构建步骤

点击jenkins里出现的示例工程名 –> Configure –> Build (Add build step),

增加一个Execute shell构建步骤:

Build工程并显示生成的数据

报告生成流程分析

Bugs、Velnerabilities、Code Smells

对于Objective-C语言,是通过oclint静态扫描工程代码来生成相关数据。

单元测试

利用xcodebuild命令运行虚拟机进行单元测试,然后把输出结果数据生成报告。

覆盖率

利用slather工具生成数据报告。

功能探讨

目前针对objective-c语言,利用上面提到的objective-c插件,只支持1个Bug和186个Code Smells,Bug和Vulnerability支持的不够。

由于SonarQube并不是完全开源,对于objective-c,它有商业版的插件,如果想要把Bug、Vulnerability支持的好的话,就必须得自定义相关规则,并提供SonarQube支持。

因此研究了一下如何自定义规则并得到SonarQube支持,步骤如下:

  1. 修改oclint源码,添加自定义规则
  2. 修改sonar-objectivec插件源码,添加自定义规则
  3. 构建代码工程,检测自定义规则,生成显示数据

oclint添加自定义规则

下载oclint源码,地址:https://github.com/oclint/oclint

进入代码主目录,利用脚手架脚本生成自定义规则模版文件:

对生成的TestRule.cpp文件进行编辑,实现自定义规则逻辑。

最后编译整个工程:

用生成的oclint程序对测试代码进行测试:

sonar-objectivec插件支持自定义规则

SonarQube服务端程序利用插件识别规则,并写入数据库,所以插件代码也需要进行修改。

下载插件源码,地址:https://github.com/Backelite/sonar-objective-c.git

需要修改如下3个文件:

src/main/resources/com/sonar/sqale/oclint-model.xmlsrc/main/resources/org/sonar/plugins/oclint/profile-oclint.xmlsrc/main/resources/org/sonar/plugins/oclint/rules.txt

然后编译插件:

最后把生成的.jar插件拷贝到SonarQube服务端程序的extensions/plugins目录下,再重启SonarQube服务。

reference

https://github.com/Backelite/sonar-objective-c

https://mp.weixin.qq.com/s/xi7pZmMMVZZlBNee-Md-Ig

https://www.jianshu.com/p/74bee59fef1c

http://blog.csdn.net/hdwhappy/article/details/61924772

http://blog.csdn.net/hdwhappy/article/details/78486564

原文:https://yq.aliyun.com/articles/541761?spm=a2c41.11181499.0.0

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐