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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: # 简介 ## Jenkins Jenkins是一款开源的持续集成工具,它的特点:易于安装、易于配置、可扩展(自己开发插件),并且它拥有数以百计的成熟插件,这种插件式的特点提供可做任何事情的可能。

简介

Jenkins

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

Sonarqube

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

sonarqube_arch.png

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检测单个任务规则的应用情况
    检测耦合
    

sonarqube_ci.png

安装

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

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

    2. install xctool

      brew install xctool

    3. install oclint

      brew tap oclint/formulae
      brew install oclint

    4. install gcovr

      brew install gcovr

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

    6. 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连接

jenkins4gitlab.png

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

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

jenkins4gitlabApiToken.png

jenkins4gitlabPrivateToken.png

创建工程

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

jenkins4gitConfig.png

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

jenkins4gitSSHUrl.png

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

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

jenkins4credentials.png

选择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相关信息:

jenkins4sonarqubeServer.png

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

sonarqube4personalTokens.png

增加SonarScanner构建步骤

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

增加一个Execute shell构建步骤:
sonarqube_project_config1.png
sonarqube_project_config2.png
sonarqube_project_config3.png

Command内容为:

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

Build工程并显示生成的数据

jenkins_project_build.png

sonarqube_project.png

报告生成流程分析

Bugs、Velnerabilities、Code Smells

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

sonarqube_code_scan_flow.png

单元测试

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

sonarqube_unittest_flow.png

覆盖率

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

sonarqube_coverage_flow.png

功能探讨

目前针对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服务。

sonarqube_custom_rule.png

reference

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
13天前
|
前端开发 JavaScript 测试技术
前端小白逆袭之路:如何快速掌握前端测试技术,确保代码质量无忧!
【10月更文挑战第30天】前端开发技术迭代迅速,新手如何快速掌握前端测试以确保代码质量?本文将介绍前端测试的基础知识,包括单元测试、集成测试和端到端测试,以及常用的测试工具如Jest、Mocha、Cypress等。通过实践和学习,你也能成为前端测试高手。
31 4
|
29天前
|
设计模式 关系型数据库 测试技术
进阶技巧:提高单元测试覆盖率与代码质量
【10月更文挑战第14天】随着软件复杂性的不断增加,确保代码质量的重要性日益凸显。单元测试作为软件开发过程中的一个重要环节,对于提高代码质量、减少bug以及加快开发速度都有着不可替代的作用。本文将探讨如何优化单元测试以达到更高的测试覆盖率,并确保代码质量。我们将从编写有效的测试用例策略入手,讨论如何避免常见的测试陷阱,使用mocking工具模拟依赖项,以及如何重构难以测试的代码。
54 4
|
2月前
|
IDE 测试技术 持续交付
Python自动化测试与单元测试框架:提升代码质量与效率
【9月更文挑战第3天】随着软件行业的迅速发展,代码质量和开发效率变得至关重要。本文探讨了Python在自动化及单元测试中的应用,介绍了Selenium、Appium、pytest等自动化测试框架,以及Python标准库中的unittest单元测试框架。通过详细阐述各框架的特点与使用方法,本文旨在帮助开发者掌握编写高效测试用例的技巧,提升代码质量与开发效率。同时,文章还提出了制定测试计划、持续集成与测试等实践建议,助力项目成功。
85 5
|
3月前
|
IDE Java 测试技术
揭秘Java高效编程:测试与调试实战策略,让你代码质量飞跃,职场竞争力飙升!
【8月更文挑战第30天】在软件开发中,测试与调试对确保代码质量至关重要。本文通过对比单元测试、集成测试、调试技巧及静态代码分析,探讨了多种实用的Java测试与调试策略。JUnit和Mockito分别用于单元测试与集成测试,有助于提前发现错误并提高代码可维护性;Eclipse和IntelliJ IDEA内置调试器则能快速定位问题;Checkstyle和PMD等工具则通过静态代码分析发现潜在问题。综合运用这些策略,可显著提升代码质量,为项目成功打下坚实基础。
61 2
|
3月前
|
IDE 测试技术 持续交付
Python自动化测试与单元测试框架:提升代码质量与效率
随着软件行业的发展,代码质量和效率变得至关重要。自动化测试与单元测试是保证质量、提升效率的关键。Python凭借其简洁强大及丰富的测试框架(如Selenium、Appium、pytest和unittest等),成为了实施自动化测试的理想选择。本文将深入探讨这些框架的应用,帮助读者掌握编写高质量测试用例的方法,并通过持续集成等策略提升开发流程的效率与质量。
49 4
|
3月前
|
监控 jenkins 测试技术
自动化测试中的“守护神”: 持续集成与代码质量监控
【8月更文挑战第31天】在软件开发的海洋里,自动化测试犹如一座灯塔,指引着项目向着高质量和高效率的方向前进。本文将深入探讨如何通过持续集成(CI)和代码质量监控相结合的方式,构建起一道坚固的防线,保障软件项目在快速迭代中不失方向。我们将一起探索这一过程中的关键实践,以及它们是如何相互作用,共同提升软件项目的可靠性和稳定性。
|
4月前
|
测试技术 数据库 开发者
开发与运维测试问题之高代码覆盖率意味着高代码质量如何解决
开发与运维测试问题之高代码覆盖率意味着高代码质量如何解决
|
5月前
|
jenkins 机器人 测试技术
jenkins接入钉钉api接口自动化测试报告自动发送
该教程介绍了如何在Jenkins上实现接口自动化测试的持续集成,并将可视化报告发送至钉钉工作群。首先,确保准备好了自动化脚本。接着配置Jenkins:安装Git插件,设置源代码管理(如Git)和触发器(定时或推送)。使用Post build task插件处理构建后的报告,读取Allure的prometheusData.txt文件以获取测试结果。最后,安装Ding Talk插件,配置钉钉机器人,通过 Dingtalkchatbot 库发送测试报告信息到钉钉群。整个流程包括Jenkins的定时构建、Git仓库的监听以及自动化报告发送到钉钉的通知。
|
4月前
|
jenkins 数据管理 测试技术
在LabVIEW开发生命周期中提高代码质量的自动化测试方法
在LabVIEW开发生命周期中提高代码质量的自动化测试方法
57 0
|
4月前
|
Java jenkins 持续交付
Jenkins是开源CI/CD工具,用于自动化Java项目构建、测试和部署。通过配置源码管理、构建触发器、执行Maven目标,实现代码提交即触发构建和测试
【7月更文挑战第1天】Jenkins是开源CI/CD工具,用于自动化Java项目构建、测试和部署。通过配置源码管理、构建触发器、执行Maven目标,实现代码提交即触发构建和测试。成功后,Jenkins执行部署任务,发布到服务器或云环境。使用Jenkins能提升效率,保证软件质量,加速上线,并需维护其稳定运行。
129 0

热门文章

最新文章