静态代码扫描是CI/CD中重要的一环,可以在代码提交到代码仓库之后,在CI/CD流程中加入代码扫描步骤,从而及时地对代码进行质量的检查。这可以有效地降低后期维护成本,优化产品质量,提高产品交付速度。同时,静态代码扫描还可以将代码问题自动通知给开发人员,使得问题得到及时发现和解决。
什么是静态代码分析
- 静态代码分析是指无需运行被测代码,仅通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性,找出代码隐藏的错误和缺陷,如:参数不匹配、有歧义的嵌套语句、错误的递归、非法计算、可能出现的空指针引用等等。
Java常见的静态代码分析工具
工具名称 | 简介 |
---|---|
SonarQube | SonarQube 是一个用于代码质量管理的开源平台,用于管理源代码的质量。同时 SonarQube 还对大量的持续集成工具提供了接口支持,可以很方便地在持续集成中使用 SonarQube。此外, SonarQube 的插件还可以对 Java 以外的其他编程语言提供支持,对国际化以及报告文档化也有良好的支持。 |
CheckStyle | 是SourceForge下的一个项目,提供了一个帮助JAVA开发人员遵守某些编码规范的工具。它能够自动化代码规范检查过程,从而使得开发人员从这项重要,但是枯燥的任务中解脱出来。作为检验代码规范的插件,除了可以使用配置默认给定的开发规范,如Sun的,Google的开发规范啊,也可以导入像阿里的开发规范的插件。 |
PMD | PMD (Programming Mistake Detector) 是一个开源的静态代码检查工具。用于检查Java、JavaScript、PLSQL和其他语言的代码中的潜在问题,如未使用的变量、未使用的方法、无效的if语句等。PMD通过解析代码,并应用各种规则来检查代码中的潜在问题。这些规则可以根据代码质量标准进行配置,并且可以自定义规则集合。PMD提供了多种输出格式,包括控制台输出、HTML、XML和JSON格式,方便用户进行代码分析和结果处理。此外,PMD还提供了Eclipse、IntelliJ IDEA等多种IDE的插件,可以方便地在IDE中进行代码分析和问题修复。通过使用PMD,开发人员可以更快地发现和修复代码中的问题,从而提高代码质量和可维护性。 |
FindBugs | FindBugs是一款流行的Java集成开发环境,内置了丰富的代码分析功能,如代码检查、代码重构、代码搜索和代码审阅。它可以帮助开发人员更轻松地识别和调试代码问题。 |
SonarQube 特点
-
支持超过25种编程语言:Java、C/C++、C#、PHP、Flex、Groovy、JavaScript、Python、PL/SQL、COBOL等。(不过有些是商业软件插件)
-
可以在Android开发中使用
-
提供重复代码、编码标准、单元测试、代码覆盖率、代码复杂度、潜在Bug、注释和软件设计报告
-
提供了指标历史记录、计划图(“时间机器”)和微分查看
-
提供了完全自动化的分析:与Maven、Ant、Gradle和持续集成工具(Atlassian Bamboo、Jenkins、Hudson等)
-
与Eclipse开发环境集成
-
与JIRA、Mantis、LDAP、Fortify等外部工具集成
-
支持扩展插件
SonarQube架构
-
SonarQube平台主要可以分为以下几个部分
- 数据库层:Sonarqube使用一个数据库来存储所有的代码质量数据。兼容PostgreSQL 11-15、Microsoft SQL Server 12-16、Oracle 19C-21C。
- 应用程序层:Sonarqube的应用程序层包括一系列基于Java的Web应用程序,这些应用程序负责收集数据、分析代码和生成报告等任务。
- 插件层:Sonarqube的插件层是一个可扩展的架构,它允许用户安装和使用各种不同的插件来增强Sonarqube的功能和灵活性。
- 数据采集层:Sonarqube支持多种不同的代码仓库和版本控制系统,包括SVN、Git、Mercurial和ClearCase等。使用这些数据采集插件,Sonarqube可以轻松地从不同的代码库中收集数据。
SonarQube工作原理
-
代码收集:SonarQube向代码仓库请求代码,并将代码下载到本地。
-
代码分析:然后,SonarQube使用其内置的代码分析器分析代码并生成有关代码质量的重要信息,例如代码复杂性、代码重复性、代码测试覆盖率等。
-
数据存储:SonarQube将收集的数据存储在其数据库中,以供后续使用。
-
报告生成:SonarQube使用其内置的报告生成器生成各种数据可视化图表、报告和警告,并将其呈现给用户。
-
反馈和持续改进:用户可以使用SonarQube提供的反馈功能来共享意见和建议,以改善代码质量。此外,SonarQube还提供了持续集成和持续交付等功能,以帮助团队在代码开发过程中不断改进代码质量。
SonarQube环境部署
部署平台所需数据库
-
SonarQube 10.x目前兼容Microsoft SQL Server、Oracle、PostgreSQL三种数据库。我们以PostgreSQL为样例进行部署,部署方式采用导入PostgreSQL Yum 存储库。
-
首先前往PostgreSQL官网选择所需要部署的数据库版本以及数据库宿主平台与系统架构。
-
导入网站生成的存储库rpm文件
# Install the repository RPM: sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
-
关闭PostgreSQL模块流
# Disable the built-in PostgreSQL module: sudo dnf -qy module disable postgresql
-
安装PostgreSQL
# Install PostgreSQL: sudo dnf install -y postgresql16-server
-
初始化PostgreSQL
# Optionally initialize the database and enable automatic start: sudo /usr/pgsql-16/bin/postgresql-16-setup initdb
-
启动PostgreSQL并设置开机自启
sudo systemctl start postgresql-16 sudo systemctl enable postgresql-16
配置PostgreSQL远程连接以及创建SonarQube所需数据库用户与schema
-
进入数据库配置文件所在目录配置远程连接
# 进入PostgreSQL配置文件所在目录 cd /var/lib/pgsql/16/data # 编辑postgresql.conf,更改监听地址 sudo vi postgresql.conf # 找到"listen_addresses = " 一行,将localhost改为* listen_addresses = '*'
-
更改pg_hba.conf文件,配置访问控制权限
# 进入PostgreSQL配置文件所在目录 cd /var/lib/pgsql/16/data sudo vi pg_hba.conf # 在# IPv4 local connections:下面添加如下一行配置 host all all 0.0.0.0/0 md5 # 保存文件后重启PostgreSQL服务
-
使用psql工具进入数据库创建数据库用户、database、schema
# 使用系统用户登录PostgreSQL sudo -u postgres psql # 更新postgres用户密码 ALTER USER postgres WITH PASSWORD 'password'; # 创建新的数据库用户 CREATE USER sonar WITH PASSWORD 'password'; # 创建新的database,所有者是sonar CREATE DATABASE sonardb OWNER sonar; # 给sonar用户赋予这个database的所有权限 GRANT ALL PRIVILEGES ON DATABASE sonardb TO sonar; # 进入sonardb创建schema \c sonardb CREATE SCHEMA sonar_schema; # 给sonar用户赋予这个schema所有权限 GRANT ALL PRIVILEGES ON SCHEMA sonar_schema TO sonar; # 退出psql工具 \q
部署SonarQube
-
下载SonarQube
- 访问官方网站下载社区版 Community Edition
- https://www.sonarsource.com/products/sonarqube/downloads/
-
将zip压缩包上传至服务器,并解压
-
进入到SonarQube目录下的conf文件夹,编辑sonar.properties配置文件
# SonarQube 数据库连接用户与密码 sonar.jdbc.username=sonar sonar.jdbc.password=123456 # SonarQube 数据库地址 sonar.jdbc.url=jdbc:postgresql://localhost/sonardb?currentSchema=sonar_schema # SonarQube允许访问web地址 sonar.web.host=0.0.0.0 # SonarQube WEB端口 sonar.web.port=9000
-
保存完配置文件后,创建一个系统用户用于运行SonarQube
# 创建用户并更改用户密码 useradd sonar passwd sonar
-
创建systemctl service(注意SonarQube启动文件的路径)
cat >> /usr/lib/systemd/system/sonarqube.service <<EOF [Unit] Description=sonarqube After=network.target [Service] LimitCORE=infinity LimitNOFILE=100000 LimitNPROC=100000 Type=forking # SonarQube bin path ExecStart=/usr/local/sonarqube/bin/linux-x86-64/sonar.sh start ExecReload=/usr/local/sonarqube/bin/linux-x86-64/sonar.sh restart ExecStop=/usr/local/sonarqube/bin/linux-x86-64/sonar.sh stop User=sonar Group=sonar [Install] WantedBy=multi-user.target EOF
-
使用systemctl启动SonarQube,根据需求创建开机自启
sudo systemctl start sonarqube sudo systemctl enable sonarqube
-
防火墙放行SonarQube WEB默认的9000/tcp端口
sudo firewall-cmd --zone=public --add-port=9000/tcp --permanent sudo firewall-cmd --reload
-
进入SonarQube WEB默认界面,默认用户名密码都是admin
-
根据页面提示更改密码
-
默认的界面语言是英文,我们可以去插件市场下载中文包。
-
Administration -> Marketplace
-
在插件市场搜索关键词Chinese Pack即可找到中文包,点击右边的安装,稍后点击提示框的重启系统即可安装完毕
-
至此,SonarQube代码静态分析平台部署完毕,我们可以根据自己的需求进行导入需要扫描的代码项目,也可以通过例如Jetbrains全家桶的SonarQube插件进行代码扫描。在之后的教程里,会介绍使用api的方式将SonarQube接入到JenKins内,并根据JenKins的PipeLine自动导入项目进行代码规范扫描并返回结果。
Comments NOTHING