前提

这篇文章记录的是SonarQube服务搭建的详细过程,应用于云迁移后的PipleLine的代码扫描环节。

笔者有软件版本升级强迫症,一般喜欢使用软件的最新版本,编写此文的时候(2020-05-17SonarQube的最新版本为8.3.1

SonarQube简介

SonarQube是一个代码质量管理开放平台,它集成了数千种自动的静态代码分析规则,旨在提高开发人员的代码质量和安全性,使得开发人员编写更加干净,更加安全的代码。主要提供了三个比较大的功能:

  • 代码可靠性支持:提前捕获和提示代码中的错误,从而避免未定义的行为影响到终端用户。
  • 应用安全支持:修复可能危害到应用程序的漏洞,并通过安全热点学习AppSec(简单理解就是会学习和识别新的漏洞)。
  • 技术债务支持:确保管理的代码库干净并且可维护,以便提高开发人员的开发效率。

目前SonarQube支持27种编程语言,基本上覆盖了当前主流的编程语言编写的项目:

上面谈到的功能可能比较泛,实际上,研发团队可以基于SonarQube做下面的事情:

  • CI/CD流程加入一个SonarQube扫描的环节。
  • 实施代码质量阈值,只有通过了这个质量阈值检测才能进入下一个流程。
  • 代码质量低于阈值的项目要及时调整对应的代码。

质量阈值可以进行自定义,SonarQube中针对每个项目会有详细的面板信息,里面会给出项目当前的健康状态,不同级别漏洞的分类和明细,漏洞对应提交者等多维度的统计信息,方便进行问题的追踪和修复。举个例子,笔者在上一家公司项目上线需要跑一个流水线,而SonarQube设定了不同等级的阈值,对于老项目,会使用最低等级的阈值:阻断性的错误数量要求为0,对于一些新的项目,则严格要求质量如严重性的错误要求为0等,只要无法通过质量阈值检查,那么项目是无法上线的。

SonarQube安装

一般情况下,只需要安装社区版免费的SonarQube服务即可,可以基于二进制文件安装或者直接使用Docker下载镜像启动,二进制文件安装的过程比较复杂,因为SonarQube内部依赖内置的ElasticSearch做搜索,在Linux系统中需要添加一个非root用户,并且修改一些列的系统参数例如系统支持的最大可打开的文件数等等。此外,SonarQube是一个Java应用,需要本地安装JDKSonarQube7.9版本开始放弃支持MySQL数据库8.3.1版本下只支持内存模式、PostgreSQLMicrosoft SQL ServerOracle四种存储引擎。笔者调研过,持久化模式下,三种数据库中PostgreSQL的安装相对简便。下面会详细记录基于二进制文件安装SonarQube服务的过程。

软件(系统) 版本
CentOS 7.x
OpenJDK 11.x
PostgreSQL 12.x
SonarQube 8.3.1

笔者在测试的虚拟机(局域网IP192.168.56.200)上关闭了防火墙,如果防火墙开启需要开放对应的端口号。

安装JDK11

OpenJDK的安装比较简单:

mdkir /data/openjdk
cd /data/openjdk
wget https://download.java.net/openjdk/jdk11/ri/openjdk-11+28_linux-x64_bin.tar.gz
## 默认会解压到/data/openjdk/jdk-11文件夹
tar -zxvf openjdk-11+28_linux-x64_bin.tar.gz

如果系统中没有默认的JDK,可以添加到/etc/profile中:

vim /etc/profile

## /etc/profile文件中添加下面的内容
export JAVA_HOME=/data/openjdk/jdk-11
export PATH=$JAVA_HOME/bin:$PATH ## 刷新环境变量
source /etc/profile

测试一下:

[root@localhost jdk-11]# java -version
openjdk version "11" 2018-09-25
OpenJDK Runtime Environment 18.9 (build 11+28)
OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode)

安装PostgreSQL数据库

PostgreSQL的安装也相对简单,官方文档有十分详细的步骤:

yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
yum install -y postgresql12
yum install -y postgresql12-server
/usr/pgsql-12/bin/postgresql-12-setup initdb
systemctl enable postgresql-12
systemctl start postgresql-12

修改/var/lib/pgsql/12/data/pg_hba.conf配置,开放所有Host的访问:

接着重启PostgreSQL

systemctl restart postgresql-12

切换用户进入PostgreSQL的命令行,并且添加一个新的数据库用户sonar和新的数据库sonar备用:

su postgres
psql -U postgres
CREATE USER sonar WITH PASSWORD 'sonar';
CREATE DATABASE sonar WITH OWNER sonar ENCODING 'UTF8'

这样就建立了一个名称为sonar,用户名为sonar并且密码也是sonar的数据库。

安装SonarQube服务

在安装SonarQube服务之前,可以参考Prerequisites and Overview调整系统参数,这些参数其实大部分和ElasticSearch有关,查看参数:

## 一个进程可以拥有的VMA(虚拟内存区域)的数量上限
sysctl vm.max_map_count
## 同时打开的文件数目上限
sysctl fs.file-max
## 可以打开的文件描述符的上限
ulimit -n
## 可以启动线程的数量上限
ulimit -u

如果当前的会话是root用户,可以直接通过下面的命令去修改这四个参数:

sysctl -w vm.max_map_count=262144
sysctl -w fs.file-max=65536
ulimit -n 65536
ulimit -u 4096

否则需要手动修改/etc/security/limits.conf文件,在文件尾部添加:

* soft nofile 65536
* hard nofile 65536
* soft nproc 4096
* hard nproc 4096

修改/etc/sysctl.conf文件,在文件尾部添加:

vm.max_map_count=262144
fs.file-max=65536

/etc/security/limits.conf/etc/sysctl.conf更新完毕后必须重启服务器

接着新增一个用户sonarqube(根本原因是ElasticSearch不能用root用户启动):

adduser sonarqube
# 这一步需要输入密码,这里密码也暂定sonarqube
passwd sonarqube
# 分配权限
chown -R sonarqube:sonarqube /data/sonarqube

接着下载和安装SonarQube

mdkir /data/sonarqube
cd /data/sonarqube
wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-8.3.1.34397.zip
uzip sonarqube-8.3.1.34397.zip

修改配置/data/sonarqube/sonarqube-8.3.1.34397/conf/sonar.properties添加下面的属性:

sonar.jdbc.username=sonar
sonar.jdbc.password=sonar
sonar.jdbc.url=jdbc:postgresql://localhost:5432/sonar

完成所有配置之后,可以尝试控制台启动SonarQube服务:

cd /data/sonarqube/sonarqube-8.3.1.34397/bin/linux-x86-64
./sonar.sh console

如果启动正常,日志如下:

然后Ctrl C退出控制台,使用./sonar.sh start后台启动SonarQube服务即可。

这里归类一下可能会遇到的问题:

  • 提示root用户不能启动的问题,是因为ElasticSearch不允许使用root用户启动,新建一个普通用户即可。
  • 提示部分文件夹无访问权限,一般是因为新建的普通用户没有分配SonarQube所在目录的写权限。
  • 提示文件描述符或者线程数量限制,一般是因为没有修改vm.max_map_countfs.file-maxulimit -nulimit -u参数导致。

SonarQube使用

SonarQube管理员的初始化账号密码都为admin,如果需要修改密码或者分配不同权限的用户,可以在管理员的菜单栏中完成。

访问http://192.168.56.200:9000进入SonarQubeWebUI,可以先到插件市场安装一个汉化插件Chinese Pack,安装插件完成后重启服务即可实现汉化。

SonarQube提供不同类型的SonarScanner用于代码扫描和结果提交,这里以Maven为例。Mavensettings.xml需要引入下面的配置(注意父标签已经存在,重复添加父标签会导致异常):

<settings>
<pluginGroups>
<pluginGroup>org.sonarsource.scanner.maven</pluginGroup>
</pluginGroups>
<profiles>
<profile>
<id>sonar</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<!-- Optional URL to server. Default value is http://localhost:9000 -->
<sonar.host.url>
<!-- 这个位置需要替换成SonarQube服务地址,例如http://192.168.56.200:9000 -->
http://myserver:9000
</sonar.host.url>
</properties>
</profile>
</profiles>
</settings>

需要被扫描的项目中,需要引入Maven插件sonar-maven-plugin,当前最新版本为:

<plugin>
<groupId>org.sonarsource.scanner.maven</groupId>
<artifactId>sonar-maven-plugin</artifactId>
<version>3.7.0.1746</version>
</plugin>

完成配置后,只需要在项目中执行命令进行扫描即可,首次执行会比较缓慢,因为需要下载大量的规则库和插件:

# 不指定插件版本执行
mvn clean install
mvn sonar:sonar # 或者指定插件版本执行
mvn org.sonarsource.scanner.maven:sonar-maven-plugin:${插件的版本号}:sonar

此外,可以通过pom文件中的<properties>指定SonarQube的参数,如:

<properties>
<sonar.host.url>[...]</sonar.host.url>
<ssonar.projectKey>[...]</sonar.projectKey>
<sonar.projectName>[...]</sonar.projectName>
<sonar.projectVersion>[...]</sonar.projectVersion>
<sonar.login>[...]</sonar.login>
<sonar.password>[...]</sonar.password>
<sonar.sourceEncoding>[...]</sonar.sourceEncoding>
......
</properties>

项目扫描结果提交后,可以在http://192.168.56.200:9000/projects看到项目列表:

点击进去就可以看到项目扫描后的详细报告和统计:

小结

质量管理是DevOps中的一个重要环节,SonarQube是一个十分优秀的代码质量管理开放平台,笔者之前迁移服务到某云,云上的流水线配置可以通过插件形式引入SonarQube服务,这一点起到了低成本高收益的效果。

参考资料:

个人博客

(本文完 c-1-d e-a-20200517)

SonarQube搭建手记的更多相关文章

  1. mongo分布式集群搭建手记

    一.架构简介 目标 单机搭建mongodb分布式集群(副本集 + 分片集群),演示mongodb分布式集群的安装部署.简单操作. 说明 在同一个vm启动由两个分片组成的分布式集群,每个分片都是一个PS ...

  2. Kafka相关内容总结(Kafka集群搭建手记)

    简介 Kafka is a distributed,partitioned,replicated commit logservice.它提供了类似于JMS的特性,但是在设计实现上完全不同,此外它并不是 ...

  3. mongodb分布式集群搭建手记

    一.架构简介 目标单机搭建mongodb分布式集群(副本集 + 分片集群),演示mongodb分布式集群的安装部署.简单操作. 说明在同一个vm启动由两个分片组成的分布式集群,每个分片都是一个PSS( ...

  4. n2n搭建手记-2-V2

    n2n-V2搭建 [1.]在V1中遇到的问题 在完成V1搭建后,边缘节点1台机器由centos 6.5 重装为Centos 7 ,再次重加入V1时遇到 与节点其他机器 可 ping通.能通过机器的公网 ...

  5. n2n搭建手记-1-V1

    搭建环境 supernode :阿里云主机一台 aly1(Centos 6.5) edg2node:美团云机器两台 mty1,mty2(Centos 7.0) Step-1 各机器安装subviers ...

  6. SonarQube搭建和使用教程

    我想使用 SonarQube 查阅代码 请问怎么做,现在只有一个要审查代码的项目

  7. win7搭建本地SonarQube环境进行c#代码分析

    1.SonarQube需要正常运行,首先需要安装Java环境,我这里安装的是jdk-8u181版本,可以在下面网站找适的版本去下载安装 https://www.oracle.com/technetwo ...

  8. 手把手教你用SonarQube+Jenkins搭建--前端项目--代码质量管理平台 (Window系统)

    前言 网上教程大多介绍的是Linux系统下SonarQube+Jenkins如何使用,这是因为这两款软件一般都是部署在服务器上,而大多数服务器,采用的都是Linux系统.大多数服务器用Linux的原因 ...

  9. SonarQube install on Kubernetes

    Sonarqube搭建代码 apiVersion: extensions/v1beta1 kind: Deployment metadata: name: postgres labels: app: ...

随机推荐

  1. 使用Reactor响应式编程

    介绍 响应式编程 响应式编程不同于我们熟悉的命令式编程,我们熟悉的命令式编程即代码就是一行接一行的指令,按照它们的顺序一次一条地出现.一个任务被执行,程序就需要等到它执行完了,才能执行下一个任务.每一 ...

  2. 用asp.net core结合fastdfs打造分布式文件存储系统

    最近被安排开发文件存储微服务,要求是能够通过配置来无缝切换我们公司内部研发的文件存储系统,FastDFS,MongDb GridFS,阿里云OSS,腾讯云OSS等.根据任务紧急度暂时先完成了通过配置来 ...

  3. input框处理大全

    1.去掉谷歌input记住账号或密码时默认出现的黄色背景: 直接用css的内阴影来覆盖黄色(代码中 white可换成其他颜色) input:-webkit-autofill { -webkit-box ...

  4. Vue-cli4脚手架搭建

    一:要安装Node.js:安装路径要默认安装(node-v12.16.2-x64.msi-长支持 二:要安装cnpm 1)说明:npm(node package manager)是nodejs的包管理 ...

  5. JDK13的六大重要新特性

    文章目录 JDK13的六大重要特性 支持Unicode 12.1 动态CDS归档(Dynamic CDS Archiving) java.net.Socket和java.net.ServerSocke ...

  6. 使用VSCode连接到IBM Cloud区块链网络

    文章目录 从IBM Cloud控制面板导出连接信息 在VSCode中创建gateway和wallet 在VSCode中提交transaction 上篇文章我们讲到怎么在IBM Cloud搭建区块链环境 ...

  7. 【手把手教你】win10 虚拟机 VMware Workstation Pro 15下安装Ubuntu 19.04

    虚拟机 VMware Workstation Pro 15.5.0 及永久激活密钥 https://www.cnblogs.com/zero-vic/p/11584437.html Ubuntu19. ...

  8. 关于SpringBoot集成myBatis时,mapper接口注入失败的问题

    问题描述: 在Spring Boot集成myBatis时,发现启动时,mapper接口一直注入失败. 现象如下: VehicleDAO就是需要的mapper对象,一个简单的接口. 已经在applica ...

  9. JavaScript实现选择排序

    一.选择排序简介 **冒泡排序.插入排序.选择排序合称为简单排序.**下面是选择排序的思想: 假设有一个数组a,我们想象成有一个班级名叫a班,现在全班随意排成一排,排头的位置是a[0],排尾的位置是a ...

  10. INTERVIEW #2

    吐槽下ZZ的面试安排:面试时间12:30不说了,周围没有饭店,中午就没吃饭...不像其他公司给每个人安排不同的面试时间,这样可以节约大家的时间,SPDB是把一大批人都安排在了12:30,而且面试是5个 ...