百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

代码质量扫描工具SonarQube原理及环境搭建

suiw9 2025-01-27 00:16 31 浏览 0 评论

前言

静态代码扫描是CI/CD中重要的一环,可以在代码提交到代码仓库之后,在CI/CD流程中加入代码扫描步骤,从而及时地对代码进行质量的检查。这可以有效地降低后期维护成本,优化产品质量,提高产品交付速度。同时,静态代码扫描还可以将代码问题自动通知给开发人员,使得问题得到及时发现和解决。

通俗地说,通过将静态代码分析融入到CI/CD流程中,可以进一步提高软件开发过程的效率和质量,帮助团队快速交付高质量的产品。

一、静态代码分析

1.什么是静态代码分析

静态代码分析是指无需运行被测代码,仅通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性,找出代码隐藏的错误和缺陷,如:参数不匹配、有歧义的嵌套语句、错误的递归、非法计算、可能出现的空指针引用等等。

2.静态代码分析作用

  • 快速定位代码隐藏错误和缺陷;
  • 提高软件可靠性并节省软件开发和测试成本;

二、常见的静态代码分析工具

1.Java语言常用的静态代码分析工具

名称

简介

SonarQube

是一个开源的代码质量管理平台,可以帮助团队分析代码质量,并生成报告和指标。它支持检测常见的代码质量问题,如代码重复、复杂性、安全漏洞等。

Checkstyle

是一个开源的Java代码规范检查工具,可以自定义代码规范并对Java代码进行实时检查,可以检测到常见的Java编码约定问题,侧重编码风格的检查。

PMD

是一个开源的代码检查器,用于分析Java源代码,可以检测到常见的代码问题,如不必要的对象创建、未使用的变量、空循环等。通过内置的编码规则,通过缺陷匹配对代码进行静态检查。

FindBugs

是一个用于静态分析Java字节码的开源工具,支持查找并修复在Java应用程序中常见的错误。它可以检测到潜在的错误、线程安全问题、不良实践等。

IntelliJ IDEA

是一款流行的Java集成开发环境,内置了丰富的代码分析功能,如代码检查、代码重构、代码搜索和代码审阅。它可以帮助开发人员更轻松地识别和调试代码问题。

2.Python语言常用的静态代码分析工具

名称

简介

Pylint

是Python语言静态代码分析的一种工具,可以识别并报告程序中的错误、代码不规范、不安全的代码等,支持多种代码风格。

Flake8

是一个集成了多个Python代码检查工具的工具,包括PyFlakes、PEP8和mccabe等工具,可以检查代码语法、代码风格以及代码复杂性。

Pyflakes

是一个轻量级的Python代码静态分析工具,用来检查语法和代码风格,并识别出不合法的操作或语句。

Bandit

是一个基于AST(抽象语法树)的Python安全性扫描器,能识别出代码中的常见漏洞如SQL注入、XSS和代码注入等。

mypy

是Python的静态类型检查器,在代码编写时就可以发现类型问题,并帮助开发人员编写更稳健、易维护的Python代码。

Pysa

Facebook开源的、侧重代码安全性检测的工具

三、代码质量检测神器-SonarQube

1.SonarQube简介

1)什么是SonarQube

Sonarqube是一款开源的代码质量管理平台,用于检测代码中的错误,漏洞和代码规范,通过插件的机制,可以基于现有的Gitlab、Jenkins 集成、以便在项目拉取后进行连续的代码检查。旨在提供一个完整的代码质量管理解决方案。

2)SonarQube的优势

  • 支持众多计算机编程语言
  • 通过插件机制能集成IDE、Jenkins、Git等
  • 内置大量常用代码检查规则
  • 支持定制开发规则
  • 可视化界面
  • 支持从可靠性、安全性、可维护性、覆盖率、重复率等方面分析项目

2.SonarQube组成

Sonarqube的架构可以分为以下几个部分:

  • 数据库层:Sonarqube使用一个数据库来存储所有的代码质量数据。
  • 应用程序层:Sonarqube的应用程序层包括一系列基于Java的Web应用程序,这些应用程序负责收集数据、分析代码和生成报告等任务。
  • 插件层:Sonarqube的插件层是一个可扩展的架构,它允许用户安装和使用各种不同的插件来增强Sonarqube的功能和灵活性。
  • 数据采集层:Sonarqube支持多种不同的代码仓库和版本控制系统,包括SVN、Git、Mercurial和ClearCase等。使用这些数据采集插件,Sonarqube可以轻松地从不同的代码库中收集数据。

3.SonarQube工作原理

Sonarqube的工作原理如下:

  1. 代码收集:首先,Sonarqube向代码仓库请求代码,并将代码下载到本地。
  2. 代码分析:然后,Sonarqube使用其内置的代码分析器分析代码并生成有关代码质量的重要信息,例如代码复杂性、代码重复性、代码测试覆盖率等。
  3. 数据存储:Sonarqube将收集的数据存储在其数据库中,以供后续使用。
  4. 报告生成:Sonarqube使用其内置的报告生成器生成各种数据可视化图表、报告和警告,并将其呈现给用户。
  5. 反馈和持续改进:用户可以使用Sonarqube提供的反馈功能来共享意见和建议,以改善代码质量。此外,Sonarqube还提供了持续集成和持续交付等功能,以帮助团队在代码开发过程中不断改进代码质量。

4.Sonar与Sonarqube的关系

Sonar是一个开源的代码质量管理平台,而SonarQube是Sonar的一个商业版本(之前叫做Sonar Enterprise Edition)。SonarQube有许多增强功能,如更强大的规则引擎、更好的报告和更高级的集成等。

SonarQube是开源的,但它还包括了许多收费的插件和额外的支持服务,这些只能在商业许可下使用。Sonar和SonarQube之间的区别在于SonarQube提供了一些高级功能,特别是在企业环境中需要更多的规则和细粒度的安全,并且需要承担更多的管理和支持责任。

四、Sonarqube环境搭建

以下提供Windows和Linux两种搭建方式。

1.SonarQube配置与启动-Windows

1)下载解压SonarQube

将sonarqube压缩包解压后,即可进入bin目录启动,sonar兼容Mac、Linux、Windows系统,不同系统进入对应的目录启动即可。

例如,我的电脑系统是Windows x86架构64位系统,则进入“D:\sonarqube-7.6\bin\windows-x86-64”目录,双击StartSonar.bat即可启动sonar服务。启动成功后,打开浏览器,访问http://localhost:9000,默认用户名密码:admin/admin

2)SonarQube配置数据库

打开SonarqQube安装目录,修改\conf\sonar.properties文件,指定连接的数据库、用户名、密码,不同的数据库修改对应的jdbc连接、用户名密码等。

3)SonarQube修改服务端口号

默认端口号为9000,可以通过\conf\sonar.properties文件中“WEB SERVER”配置修改端口号,修改完成后需要重启sonar服务:

2.SonarQube配置与启动-Linux

1)MySQL数据库配置

我安装的SonarQube-7.6版本,要求MySQL版本要>=5.6且<8.0,否则sonar无法启动

CREATE USER 'sonar'@'%' IDENTIFIED BY 'sonar';  # 创建用户
CREATE DATABASE sonar CHARACTER SET UTF8;  # 创建sonar专用数据库
GRANT ALL PRIVILEGES ON sonar.* TO 'sonar'@'%';  # 为sonar用户授予sonar数据库全部操作权限

2)Linux sonar用户配置

① 创建sonar用户

useradd sonar  # 创建sonar用户
passwd sonar  # 为sonar用户设置密码,运行此命令后输入两遍密码

② 为sonar用户添加root权限

修改 /etc/sudoers 文件,找到root一行,在root下面添加一行,如下:

sonar    ALL=(ALL)    ALL

③ 以root权限登录sonar用户

su - sonar

3)上传并解压sonarqube

上传压缩文件到sonar用户目录下,并解压,确保解压后的目录属组为sonar

4)配置sonarqube数据库连接

编辑sonarqube/conf目录下的配置文件sonar.properties,配置sonarqube连接数据库的用户名、密码,以及数据库地址。数据库版本要求:MySQL >=5.6 && < 8.0

5)修改sonar web端访问端口号(如需要)

若sonar所在服务器的9000端口被占用,则需要修改为其他端口,若未被占用则不需要修改

6)配置sonar环境变量

配置环境变量后不需要再进入sonar的bin目录即可快速启动sonar

用root用户编辑 /etc/profile 文件,添加如下内容:

export SONAR_HOME=/home/sonar/sonarqube

export PATH=${PATH}:${SONAR_HOME}"/bin/linux-86-64"

source /etc/profile

7)启动sonar

sonar启动有两种方式:一种是带日志启动,一种是后台启动

sonar.sh start  # 不打印日志启动sonar
sonar.sh console start  # 打印日志启动sonar、前台启动

出现SonarQube is up表示启动成功:

启动成功后,sonar数据库中会自动生成多张表

8)登录sonarqube

访问地址:http://192.168.1.122:9000/,账号密码:admin admin

登录成功后界面如下:

3.SonarQube汉化

直接搜索Chinese Pack安装即可,但是旧版本的sonar无法直接搜索安装,需要对照对应插件版本下载安装。

以sonar-7.6版本为例:

① 下载汉化插件

1.26版本汉化插件下载地址:https://github.com/xuhuisheng/sonar-l10n-zh/releases/tag/sonar-l10n-zh-plugin-1.26

sonar与汉化插件版本对应关系:

② 将插件放入sonarqube安装目录的extensions\plugins目录下,并重启sonar服务

汉化后的效果:

4.安装过程中常见问题及解决办法

参考链接:https://www.cnblogs.com/zndxall/p/12095769.html

1)启动sonar报错“/temp/conf/es/elasticsearch.yml”访问被拒绝

问题原因:注意检查/home/sonarqube-7.6/temp目录下的子目录及文件所属用户是否为sonar,如果是root,要改为sonar(有可能是第一次使用chown命令设置所属用户后,再次使用root用户修改配置文件,导致该conf目录所属用户发生变更)

解决办法:重新配置conf目录所属用户,一定要确保sonarqube-7.6目录及子目录所属用户为sonar

chown -R sonar:sonar sonarqube-7.6

再次查看,目录配置正确

2)root用户启动sonar报错

问题原因:因为安全问题elasticsearch 不让用root用户直接运行

解决办法:要创建一个用户,以该用户来启动sonar,同时注意sonar主目录的所属用户要是该用户

小结

以上就是静态代码扫描工具sonarqube组成、原理及在不同系统中的环境搭建的全部过程,在环境搭建过程中,一定要注意:

  • sonarqube与数据库的版本对应关系;
  • sonarqube解压后的目录属组为sonar用户组;
  • 一定要以非root用户启动;

相关推荐

10款超实用JavaScript音频库(js播放音频代码)

HTML5提供了一种新的音频标签实现和规范用一个简单的HTML对象而无需音频插件来控制音频。这只是一个简单的整合这些新的HTML5音频特征及使用JavaScript来创建各种播放控制。下面将介绍10款...

Howler.js,一款神奇的 JavaScript 开源网络音频工具库

o...

PROFINET转Modbus网关——工业协议融合的智能枢纽

三格电子SG-PNh750-MOD-221,无缝连接Profinet与Modbus,赋能工业物联产品概述...

简单实用的Modbus类库,支持从站和DTU

一、简介...

[西门子PLC] S7-200 SMART PROFINET :通过GSD组态PLC设备

从S7-200SMARTV2.5版本开始,S7-200SMART开始支持做PROFINETIO通信的智能设备。从而,两个S7-200SMART之间可以进行PROFINETI...

Modbus(RTU / TCP)有什么异同(modbus tcp和tcp)

Modbus是一种广泛使用的工业自动化通信协议,它支持设备之间的数据交换。Modbus协议有两个主要的变体:ModbusRTU(二进制模式)和ModbusTCP(基于TCP/IP网络的模式)。尽管...

Modbus通信调试步骤详解(modbus调试工具怎么用)

Modbus通信调试步骤详解  Modbus通信分为串口和以太网,无论是串口还是以太网,只要是标准Modbus,就可以用Modbus模拟器进行调试。按以下几步进行调试。...

理解Intel手册汇编指令(intel 汇编指令手册)

指令格式...

「西门子PLC」S7-200 SMART的Modbus RTU通讯

S7-200SMART集成的RS485端口(端口0)以及SBCM01RS485/232信号板(端口1)两个通信端口可以同时做MODBUSRTU主站,或者一个做MODBUSRTU主站一个做MO...

InfiniBand网络运维全指南:从驱动安装到故障排查

一、InfiniBand网络概述InfiniBand(直译为“无限带宽”技术,缩写为IB)是一种用于高性能计算的计算机网络通信标准,具有极高的吞吐量和极低的延迟,用于计算机与计算机之间的数据互连。它...

一加回归 OPPO,背后的秘密不可告人

有这样一个手机品牌,它诞生于互联网品牌。在大众群体看来,它的身世似乎模糊不清,许多人以为它是国外品牌。它的产品定位是极客群体,深受国内发烧友,甚至国外极客玩家喜爱。...

[西门子PLC] S7-200SMART快速高效的完成Modbus通信程序的设计

一、导读Modbus通信是一种被广泛应用的通信协议,在变频器、智能仪表还有其他一些智能设备上都能见到它的身影。本文呢,就把S7-200SMART系列PLC当作Modbus主站,把...

狂肝10个月手搓GPU,他们在我的世界中玩起我的世界,梦想成真

梦晨衡宇萧箫发自凹非寺量子位|公众号QbitAI自从有人在《我的世界》里用红石电路造出CPU,就流传着一个梗:...

[西门子PLC] 博途TIA portal SCL编程基础入门:1-点动与自锁

一、S7-SCL编程语言简介...

工作原理系列之:Modbus(modbus工作过程)

MODBUS是一种在自动化工业中广泛应用的高速串行通信协议。该协议是由Modion公司(现在由施耐德电气公司获得)于1979年为自己的可编程逻辑控制器开发的。该协议充当了PLCS和智能自动化设备之间的...

取消回复欢迎 发表评论: