💯 作者: 俗世游子【谢先生】。 8年开发3年架构。专注于Java、云原生、大数据等领域技术。

💥 成就: 从CRUD入行,负责过亿级流量架构的设计和落地,解决了千万级数据治理问题。

📖 同名社区:​​51CTO​​​、 掘金​、​​gitee​​​。

📂 清单: ​​​goku-framework​​​、​​【更新中】享阅读II​


DevOps系列内容

​深入浅出DevOps:DevOps核心思想​

​深入浅出DevOps:版本控制Git&Gitlab​

​深入浅出DevOps:持续集成工具Jenkins​

​深入浅出DevOps:简易Docker入门​

​深入浅出DevOps:Jenkins实战之CI​

为什么要提升代码质量

本人所在公司业务方面已经开发的差不多了,现在质量部门开始找事情了:开始对代码编写规范,编写质量,数据建模规范有强制要求。最近一直就在搞这个事情。

但其实我们想一想,不管是项目初期或者其他时间,我们为什么都在强调代码规范问题,这会为我们产生什么样的影响呢?

首先,在企业中开发的项目大多都是多人协作开发,每个人的技术水平和编码习惯很难保证统一,如果没有一个良好的规范和约束,那么其他人在接手项目时他们的内心一定是这样的:

深入浅出DevOps:SonarQube提升代码质量_DevOps

其次,提升自己的代码质量也能对自己产生比较好的效果,比如:

  • 心情愉悦,不至于让自己陷入到“祖传代码”中
  • 降低因为踩坑而造成的工作时长,省下来的时间摸鱼不香么

上面两点都不重要,而最重要的一点是:

  • 提高自身的工程和架构能力。提高代码质量是一个持续性的工作,如何指定相应的规范、如何将重构进行延续这是一门学问。需要我们好好的探讨。

可以从 “工程创建”- “技术选型”- “Git规范”- “前后端协同”- “代码编写”等方面好好的对自己的项目进行检查

SonarQube

单有了规范还不行,还需要有检查落地情况的工具。而SonarQube就是其中的代表产品。

简介

SonarQube是自动代码审查工具,用于检测代码中的错误、漏洞和代码异味。它可以与您现有的工作流程集成,以实现跨项目分支和拉取请求的持续代码检查。拥有如下特性:

  • 代码覆盖:通过单元测试,将会显示哪行代码被选中
  • 改善编码规则:通过特定的规则对整个项目中的代码情况进行检查,分析其中的错误、漏洞和代码异味并进行统计,生成响应的报告。并且根据Git提交记录分配到响应的提交者
  • 对比数据:比较同一张表中的任何测量的趋势

SonarQube功能强大,适用于 29 种编程语言,包括Java,Scala,JavaScript等语言,而且能够集成在IDE、Jenkins、Git等服务中,方便随时查看代码质量分析报告。

小插曲

SonarQube提供了响应的IDEA的插件,在插件中找到SonarLint并进行安装

深入浅出DevOps:SonarQube提升代码质量_DevOps_02

当你在代码编写的过程中,SonarLint会自动对代码进行规范检查,在SonarLint的窗口中会显示出来,并且代码块会出现灰色的波浪线

深入浅出DevOps:SonarQube提升代码质量_SonarScanner_03



SonarQue的安装

插件介绍完之后,我们就正式进入到SonarQube的安装阶段。首先先来看配置要求 ​​最新版环境要求​​:

  • 选择安装的是SonarQube比较新的版本:8.9.3-community
  • 直接安装在物理机上的话需要安装JDK11的版本,Java 11 以外的版本不受官方支持
  • 服务器资源最少需要2G内存,磁盘的读写性能必须要好

SonarQube的检索采用的是Elasticsearch来处理,因而对服务器的要求相对比较高

这里就采用PostgreSQL作为存储数据库

Docker安装

本人对PostgreSQL不熟,就直接使用Docker来安装了。点击​​官网​​可以找到其他的安装方式

设置容器在同一个网络中,容器内部就可以直接通过容器名访问

version: "3"
services:
db:
image: postgres
container_name: db
restart: always
privileged: true
ports:
- 5432:5432
networks:
- sonarnet
environment:
POSTGRES_USER: sonar
POSTGRES_PASSWORD: sonar
volumes:
- /opt/postgresql:/var/lib/postgresql
sonarqube:
image: sonarqube:8.9.3-community
container_name: sonarqube
restart: always
privileged: true
depends_on:
- db
ports:
- "9000:9000"
networks:
- sonarnet
environment:
SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar
SONAR_JDBC_USERNAME: sonar
SONAR_JDBC_PASSWORD: sonar
volumes:
- /opt/sonarqube/data:/opt/sonarqube/data
- /opt/sonarqube/extensions:/opt/sonarqube/extensions
- /opt/sonarqube/logs:/opt/sonarqube/logs
networks:
sonarnet:
driver: bridge

然后执行如下命令进行操作

docker-compose up -d

镜像下载完成之后会自动启动SonarQube服务,但是首次是启动不成功的。

深入浅出DevOps:SonarQube提升代码质量_SonarScanner_04

由于在SonarQube中使用了Elasticsearch组件,所以在启动服务的时候需要设置文件的句柄数。相信使用过Elasticsearch的同学都了解这个情况。

那么我们就来设置一下,想要设置为永久有效,就需要对​​/etc/​​​​sysctl.conf​​文件进行编辑,根据上方提示修改指定配置

vm.max_map_count=262144

保存好之后执行​​sysctl -p​​ 进行刷新,然后重新启动就好

操作

接下来等待较长时间之后,我们就可以通过浏览器来访问​​http://ip:9000​​进入到Web页面,其中默认账户和密码都为admin

第一次通过默认账户密码登录成功之后,会要求你修改密码,修改成功之后就能进入到首页

深入浅出DevOps:SonarQube提升代码质量_SonarQube_05

插件安装

SonarQube除了自身的功能之外,本身和Jenkins一样,也支持安装插件来扩展功能。在安装插件的过程中注意SonarQube的相关提示:

深入浅出DevOps:SonarQube提升代码质量_DevOps_06

插件统一管理在Administration>Marketplace位置下,然后根据自己的需要安装对应的插件即可

注意,插件安装完成之后需要重启服务,可以在Web上直接点击重启按钮或者通过Docker操作

Chinese Pack

默认SonarQube全部是英文,安装该插件之后可以转换为中文

创建项目

接下来我们回到项目页面,默认情况下这里什么都没有,接下来我们看看创建项目的N中方式

Maven提交

配合Maven是最简单的一种方式,我们只需要在本地的​​settings.xml​​中将SonarQube的基本信息配置上就可以

​点击​​查看更多相关信息

<profiles>
<profile>
<id>sonar</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<!-- 平台登录的账号的用户名 -->
<sonar.login>admin</sonar.login>
<!-- SonarQube平台登录的账号的密码 -->
<sonar.password>admin123</sonar.password>
<!-- SonarQube访问地址 -->
<sonar.host.url>http://192.168.10.200:9000</sonar.host.url>
<!-- 代码分析包括哪些文件需要分析,英文逗号分隔 -->
<sonar.inclusions>**/*.java,**/*.xml</sonar.inclusions>
</properties>
</profile>
</profiles>
<activeProfiles>
<activeProfile>sonar</activeProfile>
</activeProfiles>

那么接下来在项目中执行​​mvn sonar:sonar​​就可以完成项目的创建了

深入浅出DevOps:SonarQube提升代码质量_DevOps_07

等待一段时间之后,我们可以通过点击提示的地址去查看相关信息,首先保证项目是正常提交成功的,我们再说其他信息

深入浅出DevOps:SonarQube提升代码质量_SonarQube_08

深入浅出DevOps:SonarQube提升代码质量_SonarQube_09

通过点击对应的信息我们都可以看到相关的说明,并且根据我们配置的质量规则会告诉你当前问题的原因和解决方式

SonarScanner

除了配合Maven之外,SonarScanner也是一种方式,SonarScanner是独立的工具,专业服务与SonarQube。

为了之后能够和Jenkins进行整合,接下来我选择在SonarQube所在的服务器上进行操作

  • 下载

wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.6.0.2311-linux.zip
unzip sonar-scanner-cli-4.6.0.2311-linux.zip

  • 配置文件配置

通过编辑​​$install_directory/conf/sonar-scanner.properties​​,在此处配置有关SonarQube基础环境,例如SonarQube服务器连接详细信息

# SonarQube访问地址,和Maven配置是一样的
sonar.host.url=http://192.168.10.200:9000
sonar.login=admin
sonar.password=admin123

如果不想这样配置的话,那么在执行命令的过程中也可以通过​​-D​​的方式将参数配置到启动程序中,比如

  • -Dsonar.login=xxx
  • -Dsonar.password=xxx
  • ...

那配置完成之后,就需要配置项目信息了,这样才能一起玩起来,需要配置如下关键信息:

  • 项目名称和本地source

# 默认为项目名
sonar.projectName=
# 基础目录
sonar.projectBaseDir=
# 相对于sonar-project.properties所在目录,默认为 . 如果没有,那就指定项目空间下的目录,比如src
sonar.sources=.

  • 推送到SonarQube的唯一标识,也可以认定为是在SonarQube项目页的展示名

sonar.projectKey=

  • 项目编辑之后的生成目录

sonar.java.binaries=

sonar-project.properties

那么,根据我们之前的DevOps_App项目来介绍,这个配置文件应该是这样的

sonar.projectName=DevOps_App
sonar.projectKey=DevOps_App
sonar.sources=.
sonar.java.binaries=target/

通过执行​​sonar-scanner​​就可以完成推送到SonarQube的流程。

而属性 ​​project.settings​​可用于指定项目配置文件的路径,这样能够替代无法在项目根目录下创建 sonar-project.properties 文件的麻烦问题

sonar-scanner -Dproject.settings=xxx/sonar-project.properties

命令行

如果不方便在项目下书写,那么还有其他的替代方案。

  • 命令行直接带参数

通过执行​​sonar-scanner​​​,在其后通过​​-D​​的方式跟上相对应的配置也可以完成推送到SonarQube的流程

./sonar-scanner -Dsonar.projectName=DevOps_App -Dsonar.projectKey=DevOps_App -Dsonar.sources=. -Dsonar.java.binaries=target/

两种方式都是能看到最终的结果,完美!!!

深入浅出DevOps:SonarQube提升代码质量_DevOps_10


最后

好了,到这里关于SonarQube相关的内容就先介绍到这里,本节主要是一个抛砖引玉的过程,实际生产中还需要对SonarQube的规则和项目进行自定义,这需要大家在接下来好好的熟悉熟悉