资讯专栏INFORMATION COLUMN

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

codercao / 1085人阅读

摘要:是一个用于代码质量管理的开源平台。支持,此处以为例。注意,此处必须保证该私钥对应的公钥即必须配置在上,否则会失败配置完成后点击。单元测试利用命令运行虚拟机进行单元测试,然后把输出结果数据生成报告。

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

简介

Jenkins

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

Sonarqube

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

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

1.糟糕的复杂度分布

</>复制代码

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

2.重复

</>复制代码

  1. 显然程序中包含大量复制粘贴的代码是质量低下的
  2. sonar可以展示源码中重复严重的地方

3.缺乏单元测试

</>复制代码

  1. sonar可以很方便地统计并展示单元测试覆盖率及测试结果统计

4.没有代码标准

</>复制代码

  1. sonar可以通过oclint,PMD,CheckStyle,Findbugs等等代码规则检测工具规范代码编写

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

</>复制代码

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

6.潜在的bug

</>复制代码

  1. sonar可以通过oclint,PMD,CheckStyle,Findbugs等等代码规则检测工具检测出潜在的bug

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

</>复制代码

  1. 通过sonar可以找出循环,展示包与包、类与类之间的相互依赖关系
  2. 可以检测自定义的架构规则
  3. 通过sonar可以管理第三方的jar包
  4. 可以利用LCOM4检测单个任务规则的应用情况
  5. 检测耦合

安装

jenkins

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

</>复制代码

  1. Folders Plugin
  2. Build timeout plugin
  3. Workspace Cleanup Plugin
  4. Ant Plugin
  5. Gradle Plugin
  6. Pipeline
  7. Github Organization Folders Plugin
  8. Pipeline Stage View Plugin
  9. Git Plugin
  10. Subversion Plug-in
  11. SSH Slaves plugin
  12. LDAP Plugin
  13. Email Extension Plugin
  14. 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会导致失败,建议换个端口尝试:

</>复制代码

  1. jenkins —-httpPort=9002

Sonarqube

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

配置环境变量

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

mysql建库

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

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

</>复制代码

  1. CREATE USER "sonar"@"%" IDENTIFIED BY "sonar";
  2. GRANT all privileges ON sonar.* TO "sonar"@"%" IDENTIFIED BY "sonar";
  3. flush privileges;
  4. create database sonar;

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

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

</>复制代码

  1. sonar.web.host=0.0.0.0
  2. sonar.web.port=9000
  3. sonar.jdbc.username=sonar
  4. sonar.jdbc.password=sonar
  5. sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
  6. #sonar.web.context=/your_prefix //非必须,若需要在访问sonarqube服务时加上统一的前缀则配置此项

start sonarqube

</>复制代码

  1. /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

</>复制代码

  1. 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

</>复制代码

  1. 如果报错:no implicit conversion of nil into string

sudo gem update --system

</>复制代码

  1. 如果提示:no write permissions

sudo gem install /usr/local/bin slather

install lizard

sudo pip install lizard

</>复制代码

  1. 如果没有安装pip,下载

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内容为:

</>复制代码

  1. 用户目录/.bashrc # 加载需要的环境变量
  2. ./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文件进行编辑,实现自定义规则逻辑。

最后编译整个工程:

</>复制代码

  1. cd oclint-scripts
  2. ./make

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

</>复制代码

  1. ./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
然后编译插件:

</>复制代码

  1. ./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...

原文链接

阅读更多干货好文,请关注扫描以下二维码:

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/8796.html

相关文章

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

    摘要:是一个用于代码质量管理的开源平台。支持,此处以为例。注意,此处必须保证该私钥对应的公钥即必须配置在上,否则会失败配置完成后点击。单元测试利用命令运行虚拟机进行单元测试,然后把输出结果数据生成报告。 摘要: Jenkins Jenkins是一款开源的持续集成工具,它的特点:易于安装、易于配置、可扩展(自己开发插件),并且它拥有数以百计的成熟插件,这种插件式的特点提供可做任何事情的可能。 ...

    ormsf 评论0 收藏0
  • 快速部署TEST-DRIVEN DEVELOPMENT/DEBUG环境

    摘要:关注的目标就是在代码提交之后,顺利且迅速的把新的功能部署到产品环境上。由于是,那么单元测试,回归测试,集成测试,都是实现的手段。高质量的产品需求书和高质量的自动化集成测试用例毫无疑问,是高质量软件的保证之一。 showImg(https://segmentfault.com/img/remote/1460000006877091?w=800&h=600); 什么是Test-Driven...

    SHERlocked93 评论0 收藏0
  • fir.im weekly - 「 持续集成 」实践教程合集

    摘要:来这里看看的工程师如何进行持续集成与持续部署。主要介绍了豆瓣移动持续集成和测试相关实践,用工具化自动化社会化测试来解决遇到的问题,将打包发布环节自动化。这期的持续集成实践分享就到这里。 我们常看到许多团队和开发者分享他们的持续集成实践经验,本期 fir.im Weekly 收集了 iOS,Android,PHP ,NodeJS 等项目搭建持续集成的实践,以及一些国内外公司的内部持续集成...

    A Loity 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<