Jenkins+SonarQube代码审查
一、SonarQube简介
- SonarQube是一个用于管理代码质量的开放平台,可以快速的定位代码中潜在的或者明显的错误。
- 目前支持java,C#,C/C++,Python,PL/SQL,Cobol,JavaScrip,Groovy等二十几种编程语言的代码质量管理与检测。
- 官网:https://www.sonarqube.org/
二、Docker部署SonarQube
- SonarQube docker镜像支持在amd64架构和基于arm64的Apple Silicon上运行。
- 我们建议使用Docker Engine 20.10及以上版本。
- docker安装教程:https://qingsi.blog.csdn.net/article/details/131270071
1.下载镜像
docker pull postgres:latest
docker pull sonarqube
2.创建挂载目录
#用于postgres的挂载目录
mkdir -p /data/postgres/postgresql
mkdir -p /data/postgres/data
mkdir -p /data/sonarqube/logs
mkdir -p /data/sonarqube/conf
mkdir -p /data/sonarqube/data
mkdir -p /data/sonarqube/extensions
# 授权(不授权会导致启动失败)
chmod -R 777 /data/sonarqube
3.运行容器
- 创建网络,通过容器名称就可以互相访问
docker network create sonarqube
- 先运行postgres
docker run --name postgres -d -p 5432:5432 --net sonarqube \
-v /data/postgres/postgresql:/var/lib/postgresql \
-v /data/postgres/data:/var/lib/postgresql/data \
-v /etc/localtime:/etc/localtime:ro \
-e POSTGRES_USER=sonar \
-e POSTGRES_PASSWORD=sonar \
-e POSTGRES_DB=sonar \
-e TZ=Asia/Shanghai \
--restart always \
--privileged=true \
--network-alias postgres \
postgres:latest
- 运行sonarqube(这里启动会比较久,可以使用docker logs -f sonarqube查看)
docker run -d --name sonarqube -p 9090:9000 \
-e ALLOW_EMPTY_PASSWORD=yes \
-e SONARQUBE_DATABASE_USER=sonar \
-e SONARQUBE_DATABASE_NAME=sonar \
-e SONARQUBE_DATABASE_PASSWORD=sonar \
-e SONARQUBE_JDBC_URL="jdbc:postgresql://postgres:5432/sonar" \
--net sonarqube \
--privileged=true \
--restart always \
-v /data/sonarqube/logs:/opt/sonarqube/logs \
-v /data/sonarqube/conf:/opt/sonarqube/conf \
-v /data/sonarqube/data:/opt/sonarqube/data \
-v /data/sonarqube/extensions:/opt/sonarqube/extensions \
sonarqube
4.访问
三、Jenkins+SonarQube整合
1.安装Sonar Scanner插件
2.安装Sonar Scanner软件
- 配置的名称后续配置Pipeline会用到:sonar-scanner
- 配置完不会马上下载安装,后续第一次扫描构建的时候才会下载安装。
3.获取SonarQube的token
4.在jenkins创建凭证
- 将上一步在SonarQube创建的token,在jenkins凭证管理创建
5.配置SonarQube服务器
- 需要记住这个Name:SonarQube-Server
6.非流水线项目整合
- 非流水项目步骤都是一样的。
- 以自由风格项目为例
- 参数解释:
- JDK:项目的JDK版本
- Path to project properties:项目的SonarQube的配置文件目录地址。和 Analysis properties 二选一
- 第一种配置方式:在git的项目根目录下面创建一个配置文件(sonar-project.properties)
- 第二种配置方式:将配置放到 Analysis properties
- Analysis properties:放置SonarQube的配置内容
# must be unique in a given SonarQube instance
sonar.projectKey=web_demo_pipline
# this is the name and version displayed in the SonarQube UI. Was mandatory prior to SonarQube 6.1.
sonar.projectName=web_demo_pipline
sonar.projectVersion=1.0
# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows.
# sonar.sources:扫描的代码路径,下面代表所有代码
sonar.sources=.
# 排除某些文件夹不扫描
sonar.exclusions=**/test/**,**/target/**
# JDK的版本
sonar.java.source=1.8
sonar.java.target=1.8
# 源码编码格式
# Encoding of the source code. Default is default system encoding
sonar.sourceEncoding=UTF-8
- 完成以上配置,构建完会自动推送到代码审查
7.流水线项目整合
7.1 在git根目录创建SonarQube配置文件
- 文件名称:sonar-project.properties
# must be unique in a given SonarQube instance
sonar.projectKey=web_demo_pipline
# this is the name and version displayed in the SonarQube UI. Was mandatory prior to SonarQube 6.1.
sonar.projectName=web_demo_pipline
sonar.projectVersion=1.0
# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows.
# sonar.sources:扫描的代码路径,下面代表所有代码
sonar.sources=.
# 排除某些文件夹不扫描
sonar.exclusions=**/test/**,**/target/**
# JDK的版本
sonar.java.source=1.8
sonar.java.target=1.8
# 源码编码格式
# Encoding of the source code. Default is default system encoding
sonar.sourceEncoding=UTF-8
7.2 在Pipeline脚本加入代码扫描
pipeline {
agent any
stages {
stage('pull code') {
steps {
checkout([$class: 'GitSCM', branches: [[name: '*/${branch}']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'b632ed00-fc81-43c8-a746-5aa0673b2658', url: 'git@192.168.66.100:itheima_group/web_demo.git']]])
}
}
stage('code checking') {
steps {
script {
//引入SonarQubeScanner工具
scannerHome = tool 'sonar-scanner'
}
//引入SonarQube的服务器环境
withSonarQubeEnv('SonarQube-Server') {
sh "${scannerHome}/bin/sonar-scanner"
}
}
}
stage('build project') {
steps {
sh 'mvn clean package'
}
}
stage('publish project') {
steps {
deploy adapters: [tomcat8(credentialsId: 'fc23e5b7-9930-4dfb-af66-a2a576be52fb', path: '', url: 'http://192.168.66.102:8080')], contextPath: null, war: 'target/*.war'
}
}
}
post {
always {
emailext(
subject: '构建通知:${PROJECT_NAME} - Build # ${BUILD_NUMBER} - ${BUILD_STATUS}!',
body: '${FILE,path="email.html"}',
to: '1014671449@qq.com'
)
}
}
}
- 在Jenkins构建项目即可。