前面我们完成了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
把服务up起来:
docker-compose up -d
通过日志输出我们发现启动报错了:
docker logs -f sonarqube
解决办法,修改文件:/etc/sysctl.conf
在最后加:
vm.max_map_count=262144
改完后,执行下面命令:
sysctl -p
# 再次启动
docker-compose up -d
访问地址:http://192.168.1.114:9000/
用默认的admin/admin登录。修改下密码:
中文插件
可能因为网络原因安装失败:
可以多尝试几次,安装成功,重启sonarqube:
重启后重新登录进来,看到的就是中文界面了。
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:
这样我们只要设置sonar.login为上面的token值即可,sonar.password则无需再设置。
执行sonarqube检查
接下来我们故意引入一个没有地方使用的类型:
package com.pf.boot.controller;
import org.springframework.util.CollectionUtils;
...
@RestController
public class HelloController {
...
}
执行插件:
执行后可以在sonarqube项目页看到:
完善CI基础流程
构建任务依赖设置
当我们在执行gradle build时我们希望sonarqube的插件任务以及docker插件任务都能被执行,我们可以将它们加入到gradle构建的生命周期中来:
project.tasks['bootJar'].dependsOn 'sonarqube'
project.tasks['build'].dependsOn 'dockerBuildImage'
当我们执行gradle的build任务时,我们将看到:
这样我们对jenkins中构建任务的gradle执行命令改回:
注意:
这里我们构建的是一个自由风格的任务,我们通过gradle的任务依赖方式讲构建流程串起来;而实际项目中的CI我们会采用Jenkins的pipeline流水线的方式将各个构建节点串起来,并且可以将sonarqube实现为质量门禁,如果检查指标没达到流水线就此中断,这将是我们后面的重点实践,小伙伴们可以先关注起来。
创建新的tag
现在我们提交代码到gitlab,并新打一个tag:
执行构建
当构建完成可以去sonarqube平台看到新生成的检查报告。
jenkins的SonarQube插件
我们希望在我们每次构建Jenkins任务后都能有一个链接可以链到sonarqube平台查看当前的质量报告,可以借助Jenkins的相关插件来实现。
安装好后重启jenkins。
接下来需要配置下对sonarqube服务器的连接信息,在Jenkins的系统管理中找到相应的配置区域:
密钥从sonarqube平台获取,粘贴过来:
最后点保存。
在任务配置中勾选:
这样当我们构建后可以看到相关的链接: