静态代码扫描是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架构

file

  • SonarQube平台主要可以分为以下几个部分

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

SonarQube工作原理

file

  1. 代码收集:SonarQube向代码仓库请求代码,并将代码下载到本地。

  2. 代码分析:然后,SonarQube使用其内置的代码分析器分析代码并生成有关代码质量的重要信息,例如代码复杂性、代码重复性、代码测试覆盖率等。

  3. 数据存储:SonarQube将收集的数据存储在其数据库中,以供后续使用。

  4. 报告生成:SonarQube使用其内置的报告生成器生成各种数据可视化图表、报告和警告,并将其呈现给用户。

  5. 反馈和持续改进:用户可以使用SonarQube提供的反馈功能来共享意见和建议,以改善代码质量。此外,SonarQube还提供了持续集成和持续交付等功能,以帮助团队在代码开发过程中不断改进代码质量。

SonarQube环境部署

部署平台所需数据库

  1. SonarQube 10.x目前兼容Microsoft SQL Server、Oracle、PostgreSQL三种数据库。我们以PostgreSQL为样例进行部署,部署方式采用导入PostgreSQL Yum 存储库。

  2. 首先前往PostgreSQL官网选择所需要部署的数据库版本以及数据库宿主平台与系统架构。

  3. 导入网站生成的存储库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
  4. 关闭PostgreSQL模块流

      # Disable the built-in PostgreSQL module:
      sudo dnf -qy module disable postgresql
  5. 安装PostgreSQL

      # Install PostgreSQL:
      sudo dnf install -y postgresql16-server
  6. 初始化PostgreSQL

      # Optionally initialize the database and enable automatic start:
      sudo /usr/pgsql-16/bin/postgresql-16-setup initdb
  7. 启动PostgreSQL并设置开机自启

      sudo systemctl start postgresql-16
      sudo systemctl enable postgresql-16

配置PostgreSQL远程连接以及创建SonarQube所需数据库用户与schema

  1. 进入数据库配置文件所在目录配置远程连接

    
      # 进入PostgreSQL配置文件所在目录
      cd /var/lib/pgsql/16/data
    
      # 编辑postgresql.conf,更改监听地址
      sudo vi postgresql.conf
    
      # 找到"listen_addresses = " 一行,将localhost改为*
      listen_addresses = '*'
  2. 更改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服务
  3. 使用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

  1. 下载SonarQube

  2. 将zip压缩包上传至服务器,并解压

  3. 进入到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
  4. 保存完配置文件后,创建一个系统用户用于运行SonarQube

      # 创建用户并更改用户密码
      useradd sonar
      passwd sonar
  5. 创建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
  1. 使用systemctl启动SonarQube,根据需求创建开机自启

      sudo systemctl start sonarqube
      sudo systemctl enable sonarqube
  2. 防火墙放行SonarQube WEB默认的9000/tcp端口

      sudo firewall-cmd --zone=public --add-port=9000/tcp --permanent
      sudo firewall-cmd --reload
  3. 进入SonarQube WEB默认界面,默认用户名密码都是admin

    file

  4. 根据页面提示更改密码

    file

  5. 默认的界面语言是英文,我们可以去插件市场下载中文包。

    • Administration -> Marketplace

    • 在插件市场搜索关键词Chinese Pack即可找到中文包,点击右边的安装,稍后点击提示框的重启系统即可安装完毕

      file

 
至此,SonarQube代码静态分析平台部署完毕,我们可以根据自己的需求进行导入需要扫描的代码项目,也可以通过例如Jetbrains全家桶的SonarQube插件进行代码扫描。在之后的教程里,会介绍使用api的方式将SonarQube接入到JenKins内,并根据JenKins的PipeLine自动导入项目进行代码规范扫描并返回结果。