使用Jenkins+Sonarqueb进行自动化测试和代码质量检测

摘要: Jenkins Jenkins是一款开源的持续集成工具,它的特色:易于安装、易于配置、可扩展(本身开发插件),而且它拥有数以百计的成熟插件,这种插件式的特色提供可作任何事情的可能。java

简介python

Jenkinsmysql

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

Sonarqubegithub

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

图片描述

SonarQueb主要从如下7个维度检测评估代码质量:objective-c

1.糟糕的复杂度分布sql

文件、类、方法等,若是复杂度太高将难以改变,这会使得开发人员难以理解它们,
且若是没有自动化的单元测试,对于程序中的任何组件的改变都将可能致使须要全面的回归测试

2.重复shell

显然程序中包含大量复制粘贴的代码是质量低下的
sonar能够展现源码中重复严重的地方

3.缺少单元测试数据库

sonar能够很方便地统计并展现单元测试覆盖率及测试结果统计

4.没有代码标准

sonar能够经过oclint,PMD,CheckStyle,Findbugs等等代码规则检测工具规范代码编写

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

没有注释将使代码可读性变差,特别是当不可避免地出现人员变更时,程序的可读性将大幅降低
而过多的注释又会使得开发人员将精力过多地花费在阅读注释上,亦违背初衷

6.潜在的bug

sonar能够经过oclint,PMD,CheckStyle,Findbugs等等代码规则检测工具检测出潜在的bug

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

经过sonar能够找出循环,展现包与包、类与类之间的相互依赖关系
能够检测自定义的架构规则
经过sonar能够管理第三方的jar包
能够利用LCOM4检测单个任务规则的应用状况
检测耦合

图片描述

安装

jenkins

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

Folders Plugin
Build timeout plugin
Workspace Cleanup Plugin
Ant Plugin
Gradle Plugin
Pipeline
Github Organization Folders Plugin
Pipeline Stage View Plugin
Git Plugin
Subversion Plug-in
SSH Slaves plugin
LDAP Plugin
Email Extension Plugin
Gitlab Plugin

注意事项

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

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

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

jenkins —-httpPort=9002

Sonarqube

下载
http://downloads.sonarsource....,下载后解压到相应地址,好比/opt

配置环境变量

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

mysql建库

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

若是还没有安装mysql,能够经过Homebrew进行安装,安装完成后,建立对应的帐号和数
据库:

CREATE USER 'sonar'@'%' IDENTIFIED BY 'sonar';
GRANT all privileges ON sonar.* TO 'sonar'@'%' IDENTIFIED BY 'sonar';
flush privileges;
create database sonar;

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

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

sonar.web.host=0.0.0.0
sonar.web.port=9000
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
#sonar.web.context=/your_prefix  //非必须,若须要在访问sonarqube服务时加上统一的前缀则配置此项

start sonarqube

/opt/sonarqube/bin/macosx-universal-64/sonar.sh start

download sonar scanner

https://docs.sonarqube.org/di...

objective-c plugin

github: https://github.com/Backelite/...

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

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

最后重启Sonarqube

1.Prerequisites

Installation of xcpretty with JUnit reports fix

xcpretty须要安装fixed version,才能配合Sonarqube工做。

git clone https://github.com/Backelite/...
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/formulae
brew install oclint

  • install gcovr

brew install gcovr

  • install slather

gem install slather

若是报错:no implicit conversion of nil into string

sudo gem update --system

若是提示:no write permissions

sudo gem install /usr/local/bin slather

  • install lizard

sudo pip install lizard

若是没有安装pip,下载<https: bootstrap.pypa.io="" get-pip.py="">

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构建步骤:
图片描述
图片描述
图片描述

Command内容为:

用户目录/.bashrc              # 加载须要的环境变量
./run-sonar.sh -v               # 生成数据并传递给SonarQube Server

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

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

oclint-scripts/scaffoldRule TestRule -t ASTVisitor
对生成的TestRule.cpp文件进行编辑,实现自定义规则逻辑。

最后编译整个工程:

cd oclint-scripts
./make

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

./build/oclint-release/bin/oclint -report-type pmd -o test.xml 测试代码目录/测试文件.m

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

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

下载插件源码,地址:https://github.com/Backelite/...

须要修改以下3个文件:

1.src/main/resources/com/sonar/sqale/oclint-model.xml
2.src/main/resources/org/sonar/plugins/oclint/profile-oclint.xml
3.src/main/resources/org/sonar/plugins/oclint/rules.txt
而后编译插件:

./build-and-deploy.sh

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

图片描述

reference
https://github.com/Backelite/...
https://mp.weixin.qq.com/s/xi...
https://www.jianshu.com/p/74b...
http://blog.csdn.net/hdwhappy...
http://blog.csdn.net/hdwhappy...

原文连接

阅读更多干货好文,请关注扫描如下二维码:
图片描述

相关文章
相关标签/搜索