SonarQube代码质量检测工具实践

4,354 阅读3分钟

前面我们完成了jenkins基础的CI流程实践,当我们通过gradle来构建源码生成可运行jar包时,我们并没有对代码的质量进行检测,这样部署的应用是不保险的,可能会存在很多漏洞,为此我们将引入SonarQube。

搭建SonarQube

搭建步骤

我们将同样采用docker-compose的方式来快速部署SonarQube服务,部署在server-1服务器上:

docker-compose.yml

version: '3.1'
services:
  db:
    image: postgres
    container_name: db
    ports:
      - '5432:5432'
    networks:
      - sonarnet
    environment:
      POSTGRES_USER: sonar
      POSTGRES_PASSWORD: sonar
  sonarqube:
    image: sonarqube:8.9.6-community
    container_name: sonarqube
    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
networks:
  sonarnet:
    driver: bridge

image.png

把服务up起来:

docker-compose up -d

通过日志输出我们发现启动报错了:

docker logs -f sonarqube

image.png

解决办法,修改文件:/etc/sysctl.conf

在最后加:

vm.max_map_count=262144

改完后,执行下面命令:

sysctl -p
# 再次启动
docker-compose up -d

访问地址:http://192.168.1.114:9000/

用默认的admin/admin登录。修改下密码:

image.png

中文插件

image.png

image.png

可能因为网络原因安装失败:

image.png

可以多尝试几次,安装成功,重启sonarqube:

image.png

重启后重新登录进来,看到的就是中文界面了。

gradle的sonarqube插件

插件用法

参考文档:SonarScanner for Gradle (sonarsource.com)

这里我们简单应用和配置下:

build.gradle

plugins {
    ...
    id 'org.sonarqube' version '3.2.0'
}

...

sonarqube {
    properties {
        property("sonar.host.url", 'http://192.168.1.114:9000')
        property("sonar.login", 'admin')
        property("sonar.password", '12345678')
    }
}

...

以上的配置是最简配置,还有些配置会使用默认值,包括项目的key、name、描述、version等信息,会使用我们在gradle配置中定义的相应属性值。

注意,这里的凭证也可以用sonarqqube平台生成的token:

image.png

这样我们只要设置sonar.login为上面的token值即可,sonar.password则无需再设置。

执行sonarqube检查

接下来我们故意引入一个没有地方使用的类型:

package com.pf.boot.controller;

import org.springframework.util.CollectionUtils;
...

@RestController
public class HelloController {

    ...
}

执行插件:

image.png

执行后可以在sonarqube项目页看到:

image.png

image.png

完善CI基础流程

构建任务依赖设置

当我们在执行gradle build时我们希望sonarqube的插件任务以及docker插件任务都能被执行,我们可以将它们加入到gradle构建的生命周期中来:

project.tasks['bootJar'].dependsOn 'sonarqube'
project.tasks['build'].dependsOn 'dockerBuildImage'

当我们执行gradle的build任务时,我们将看到:

image.png

这样我们对jenkins中构建任务的gradle执行命令改回:

image.png

注意:

这里我们构建的是一个自由风格的任务,我们通过gradle的任务依赖方式讲构建流程串起来;而实际项目中的CI我们会采用Jenkins的pipeline流水线的方式将各个构建节点串起来,并且可以将sonarqube实现为质量门禁,如果检查指标没达到流水线就此中断,这将是我们后面的重点实践,小伙伴们可以先关注起来。

创建新的tag

现在我们提交代码到gitlab,并新打一个tag:

image.png

执行构建

image.png

当构建完成可以去sonarqube平台看到新生成的检查报告。

jenkins的SonarQube插件

我们希望在我们每次构建Jenkins任务后都能有一个链接可以链到sonarqube平台查看当前的质量报告,可以借助Jenkins的相关插件来实现。

image.png

安装好后重启jenkins。

接下来需要配置下对sonarqube服务器的连接信息,在Jenkins的系统管理中找到相应的配置区域:

image.png

密钥从sonarqube平台获取,粘贴过来:

image.png

image.png

最后点保存。

在任务配置中勾选:

image.png

这样当我们构建后可以看到相关的链接:

image.png