这篇文章记录的是SonarQube
服务搭建的详细过程,应用于云迁移后的PipleLine
的代码扫描环节。java
笔者有软件版本升级强迫症,通常喜欢使用软件的最新版本,编写此文的时候(2020-05-17
)SonarQube
的最新版本为8.3.1
。linux
SonarQube是一个代码质量管理开放平台,它集成了数千种自动的静态代码分析规则,旨在提升开发人员的代码质量和安全性,使得开发人员编写更加干净,更加安全的代码。主要提供了三个比较大的功能:sql
AppSec
(简单理解就是会学习和识别新的漏洞)。目前SonarQube
支持27种编程语言,基本上覆盖了当前主流的编程语言编写的项目:shell
上面谈到的功能可能比较泛,实际上,研发团队能够基于SonarQube
作下面的事情:数据库
CI/CD
流程加入一个SonarQube
扫描的环节。质量阈值能够进行自定义,SonarQube
中针对每一个项目会有详细的面板信息,里面会给出项目当前的健康状态,不一样级别漏洞的分类和明细,漏洞对应提交者等多维度的统计信息,方便进行问题的追踪和修复。举个例子,笔者在上一家公司项目上线须要跑一个流水线,而SonarQube
设定了不一样等级的阈值,对于老项目,会使用最低等级的阈值:阻断性的错误数量要求为0,对于一些新的项目,则严格要求质量如严重性的错误要求为0等,只要没法经过质量阈值检查,那么项目是没法上线的。编程
通常状况下,只须要安装社区版免费的SonarQube
服务便可,能够基于二进制文件安装或者直接使用Docker
下载镜像启动,二进制文件安装的过程比较复杂,由于SonarQube
内部依赖内置的ElasticSearch
作搜索,在Linux
系统中须要添加一个非root
用户,而且修改一些列的系统参数例如系统支持的最大可打开的文件数等等。此外,SonarQube
是一个Java
应用,须要本地安装JDK
。自SonarQube
的7.9
版本开始放弃支持MySQL
数据库,8.3.1
版本下只支持内存模式、PostgreSQL
、Microsoft SQL Server
和Oracle
四种存储引擎。笔者调研过,持久化模式下,三种数据库中PostgreSQL
的安装相对简便。下面会详细记录基于二进制文件安装SonarQube
服务的过程。vim
软件(系统) | 版本 |
---|---|
CentOS |
7.x |
OpenJDK |
11.x |
PostgreSQL |
12.x |
SonarQube |
8.3.1 |
笔者在测试的虚拟机(局域网IP
为192.168.56.200
)上关闭了防火墙,若是防火墙开启须要开放对应的端口号。安全
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
中:maven
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
的安装也相对简单,官方文档有十分详细的步骤:
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
服务以前,能够参考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_count
、fs.file-max
、ulimit -n
和ulimit -u
参数致使。SonarQube管理员的初始化帐号密码都为admin,若是须要修改密码或者分配不一样权限的用户,能够在管理员的菜单栏中完成。
访问http://192.168.56.200:9000
进入SonarQube
的WebUI
,能够先到插件市场安装一个汉化插件Chinese Pack
,安装插件完成后重启服务便可实现汉化。
SonarQube
提供不一样类型的SonarScanner
用于代码扫描和结果提交,这里以Maven
为例。Maven
的settings.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)