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

maoer · · 1333 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

摘要: Jenkins Jenkins是一款开源的持续集成工具,它的特点:易于安装、易于配置、可扩展(自己开发插件),并且它拥有数以百计的成熟插件,这种插件式的特点提供可做任何事情的可能。 **简介** **Jenkins** Jenkins是一款开源的持续集成工具,它的特点:易于安装、易于配置、可扩展(自己开发插件),并且它拥有数以百计的成熟插件,这种插件式的特点提供可做任何事情的可能。 **Sonarqube** SonarQube 是一个用于代码质量管理的开源平台。通过插件形式,可以支持包括 java, Objective-C, Swift, C#, C/C++, PL/SQL,JavaScript 等等二十几种编程语言的代码质量管理与检测。 ![图片描述](http://img.blog.csdn.net/20180323151824157?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXVucWlpbnNpZ2h0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) SonarQueb主要从以下7个维度检测评估代码质量: 1.糟糕的复杂度分布 ``` 文件、类、方法等,如果复杂度过高将难以改变,这会使得开发人员难以理解它们, 且如果没有自动化的单元测试,对于程序中的任何组件的改变都将可能导致需要全面的回归测试 ``` 2.重复 ``` 显然程序中包含大量复制粘贴的代码是质量低下的 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检测单个任务规则的应用情况 检测耦合 ``` ![图片描述](http://img.blog.csdn.net/20180323152124426?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXVucWlpbnNpZ2h0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) **安装** **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.com/sonarqube/下载sonarqube,下载后解压到相应地址,比如/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/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 1.Prerequisites - Installation of xcpretty with JUnit reports fix ``` xcpretty需要安装fixed version,才能配合Sonarqube工作。 ``` 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/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连接** ![图片描述](http://img.blog.csdn.net/20180323153154617?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXVucWlpbnNpZ2h0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 在Gitlab host url处设置gitlab的url,然后在creadential处点击add。 创建一个Gitlab API token,然后在API token处填入gitlab上的token: ![图片描述](http://img.blog.csdn.net/20180323153228164?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXVucWlpbnNpZ2h0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) ![图片描述](http://img.blog.csdn.net/20180323153304478?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXVucWlpbnNpZ2h0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) **创建工程** 构建一个自由风格的软件项目,然后在源码管理处,选择git,然后进行如下配置: ![图片描述](http://img.blog.csdn.net/20180323153327472?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXVucWlpbnNpZ2h0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 在Repository URL处填入对应工程的URL,注意,因为后续工程check是通过ssh方式接入的,所以填写的URL一定是ssh URL: ![图片描述](http://img.blog.csdn.net/20180323153402074?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXVucWlpbnNpZ2h0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 然后在Branch Specifier处填入要关注的分支。 然后在Credentials处点击add,配置ssh秘钥: ![图片描述](http://img.blog.csdn.net/20180323153431742?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXVucWlpbnNpZ2h0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 选择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相关信息: ![图片描述](http://img.blog.csdn.net/20180323153509722?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXVucWlpbnNpZ2h0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 其中Server authentication token可在SonarQube网站,个人账号管理下的security处进行生成: ![图片描述](http://img.blog.csdn.net/20180323153545507?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXVucWlpbnNpZ2h0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) **增加SonarScanner构建步骤** 点击jenkins里出现的示例工程名 –> Configure –> Build (Add build step), 增加一个Execute shell构建步骤: ![图片描述](http://img.blog.csdn.net/20180323153616060?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXVucWlpbnNpZ2h0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) ![图片描述](http://img.blog.csdn.net/20180323153713047?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXVucWlpbnNpZ2h0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) ![图片描述](http://img.blog.csdn.net/20180323153754145?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXVucWlpbnNpZ2h0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) Command内容为: ``` 用户目录/.bashrc # 加载需要的环境变量 ./run-sonar.sh -v # 生成数据并传递给SonarQube Server ``` **Build工程并显示生成的数据** ![图片描述](http://img.blog.csdn.net/20180323153848348?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXVucWlpbnNpZ2h0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) ![图片描述](http://img.blog.csdn.net/20180323153914126?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXVucWlpbnNpZ2h0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) **报告生成流程分析** **Bugs、Velnerabilities、Code Smells** 对于Objective-C语言,是通过oclint静态扫描工程代码来生成相关数据。 ![图片描述](http://img.blog.csdn.net/20180323153950619?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXVucWlpbnNpZ2h0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) **单元测试** 利用xcodebuild命令运行虚拟机进行单元测试,然后把输出结果数据生成报告。 **覆盖率** 利用slather工具生成数据报告。 ![图片描述](http://img.blog.csdn.net/20180323154343007?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXVucWlpbnNpZ2h0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) **功能探讨** 目前针对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/sonar-objective-c.git 需要修改如下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服务。 ![图片描述](http://img.blog.csdn.net/20180323155605051?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXVucWlpbnNpZ2h0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) **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) **阅读更多干货好文,请关注扫描以下二维码:** ![图片描述](http://img.blog.csdn.net/20180323155817665?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXVucWlpbnNpZ2h0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1333 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传