Jenkins+SonarQube 代码审查
SonarQuba 简介
SonarQube是一个用于管理代码质量的开放平台,可以快速的定位代码中潜在的或者明显的错误。目前 支持java,C#,C/C++,Python,PL/SQL,Cobol,JavaScrip,Groovy等二十几种编程语言的代码质量管理与检 测,底层使用elasticsearch作为代码检索工具。sonarquba从gitlab获取代码,然后,审查后,将结果保存在数据库中
安装mysql数据库
msyql 安装包
链接:https://pan.baidu.com/s/1styxqqftXb-uGvI_M_Ke3g?pwd=xxqh
提取码:xxqh
链接:https://pan.baidu.com/s/1iV0aNLJLaJDcmsMfvTBhuA?pwd=ragt
提取码:ragt
yum -y install \
ncurses \
ncurses-devel \
bison \
cmake
useradd -s /sbin/nologin mysql
tar zxvf mysql-5.7.17.tar.gz -C /opt/
tar zxvf boost_1_59_0.tar.gz -C /usr/local/
cd /usr/local/
mv boost_1_59_0 boost
cd /opt/mysql-5.7.17/
cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DSYSCONFDIR=/etc \
-DSYSTEMD_PID_DIR=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DWITH_BOOST=/usr/local/boost \
-DWITH_SYSTEMD=1
##注意:如果在CMAKE的过程中有报错,当报错解决后,需要把源码目录中的CMakeCache.txt文件删除,然后再重新CMAKE,否则错误依旧
make -j6 && make install
#注: -j6 表示使用6核编译。根据实际情况来
chown -R mysql.mysql /usr/local/mysql/
vim /etc/my.cnf
-----------
[client]
port = 3306
default-character-set=utf8
socket = /usr/local/mysql/mysql.sock
[mysql]
port = 3306
default-character-set=utf8
socket = /usr/local/mysql/mysql.sock
[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 1
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES
----------------
chown mysql:mysql /etc/my.cnf
echo 'PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH' >> /etc/profile
echo 'export PATH' >> /etc/profile
source /etc/profile
cd /usr/local/mysql/
bin/mysqld \
--initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data
systemctl enable mysqld
mysqladmin -u root -p password "abc123" //给root账号设置密码为abc123提示输入的是原始密码。
mysql -u root -p
------------------------授权远程登录-------------------------------------
grant all privileges on *.* to 'root'@'%' identified by 'abc123' with grant option;
安装SonarQube
链接:https://pan.baidu.com/s/16tmFdtd_YuuZ2HMPe34akA?pwd=4bgc
提取码:4bgc
在mysql数据库创建 sonar 数据库
mysql -uroot -pabc123 -e 'create database sonar;'
mysql -uroot -pabc123 -e 'show databases;'
解压sonar ,并设置权限
yum install unzip
unzip sonarqube-6.7.4.zip #解压
mkdir /opt/sonar # 创建目录
mv sonarqube-6.7.4/* /opt/sonar #移动文件
useradd sonar #创建sonar用户,必须sonar用于启动,否则报错
chown -R sonar. /opt/sonar #更改sonar目录及文件权限
修改sonar配置文件
#jdbc 用于连接java和数据库的驱动,需要数据库的用户密码
16// sonar.jdbc.username=root #填写数据库授权用户
17// sonar.jdbc.password=abc123 #填写数据库密码
26// sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSS L=false
#sonar 默认监听9000端口,如果9000端口被占用,则需要修改。
111 #sonar.web.port=9000
注:sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar
此语句表示连接myslq数据库,使用本地的3306端口。连接的库名是sonar,所以,如果之前在mysql里创建的库名不叫sonar,要么修改mysql数据库里的库名为sonar,要么把这里的sonar 修改为和mysql数据库里创建的库名一致
启动sonar
注意,启动sonar需要使用sonar用户
cd /opt/sonar
su sonar ./bin/linux-x86-64/sonar.sh start #启动
su sonar ./bin/linux-x86-64/sonar.sh status #查看状态
netstat -natp |grep 9000
注,sonar 启动需要一段时间。如果一直没有启动,没有9000端口,再检查没有其他错误后,可以删除sonar的安装目录,然后重新解压安装
查看sonar日志和停止sonar的命令:
tail -f logs/sonar.logs 查看日志
su sonar ./bin/linux-x86-64/sonar.sh stop 停止
访问sonar
访问sonar服务器的9000端口,点击login登录
用户/密码 admin/admin
输入任意令牌,生成加密码,并保存
09b58b5d4acfdc521c8cabe65ab622bbcc73458e
语言选择Java--->Maven,然点击完成
界面如下
配置Jenkins支持sonarQube代码审查
jenkins 安装SonarQube Scanner插件
在jenkins的全局工具配置里,配置sonarquba
Manager Jenkins----> Global Tool Configuration
SonarQube Scanner ----> Add SonarQube Scanner
Name: sonar-scanner ;勾选Install automatically; 版本选择最新版
添加SonarQube凭证
Manager Jenkins --> Manager Credentials
global ---> Add Credentials
kind:Secret test ;Secret:输入令牌的加密码 ;Description:输入一个简明扼要的名称
Jenkins在系统配置里,配置SonarQube
Manager Jenkins----> Configure System
SonarQube installations---->Add SonarQube--->配置名称,sonarqube服务器地址,凭证
建立自由风格项目,验证sonarquba
在项目的配置文件中,添加构建步骤
在项目的配置文件中,添加构建步骤,选择Execute SonarQube Scanner
配置sonarqube 构建步骤
构建,然后查看
在项目的控制台输出,可以看到跳过扫描部分
刷新sonarqube首页,可以看到代码审查的结果
代码检查报错
如果代码检查报错,查看输出信息发现有如下的信息
ERROR: Error during SonarScanner execution
ERROR: Not authorized. Please check the properties sonar.login and sonar.password.
ERROR:
ERROR: Re-run SonarScanner using the -X switch to enable full debug logging.
WARN: Unable to locate 'report-task.txt' in the workspace. Did the SonarScanner succeed?
ERROR: SonarQube scanner exited with non-zero code: 2
[DeployPublisher][INFO] Build failed, project not deployed
Finished: FAILURE
这是因为jenkins连接sonar出错,原因是token不对. 是否是复制token时多复制,或者少复制。
修改凭证后重新构建即可
测试错误代码
在项目的main 目录下,新建目录java和resources
修改配置文件pom.xml,添加对servlet的依赖
在配置文件pom.xml 里的dependencies 标签里,添加配置,然后导入配置.
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
在java目录新建编写servlet文件
文件名:com.mytest.HelloServlet. 这样会在java目录下创建com.mytest目录,然后在该目录下创建HelloServlet.java文件
在HelloServlet 编写代码
package com.mytest;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//模拟错误代码(被除数不能为0)
int i = 100/0;
//模拟代码冗余(多次定义变量j,但是为使用)
int j = 100;
j = 200;
resp.getWriter().write("hello Servlet");
}
}
提交代码和配置文件
提交并推送配置文件到gitlab
`提交并推送HelloServlet`
进行构建,测试结果
!
如果maven构建报错,可能是因为java版本不符
解决方法:
再次提交项目
为流水线项目添加SonarQube代码审查
在项目根目录新建文件project.properties
sonar-
# must be unique in a given SonarQube instance
sonar.projectKey=web_demo_pipeline
# this is the name and version displayed in the SonarQube UI. Was mandatory prior to SonarQube 6.1.
sonar.projectName=web_demo_pipeline
sonar.projectVersion=1.0
# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows.
# This property is optional if sonar.modules is set.
sonar.sources=.
sonar.exclusions=**/test/**,**/target/**
sonar.java.source=1.8
sonar.java.target=1.8
# Encoding of the source code. Default is default system encoding
sonar.sourceEncoding=UTF-8
修改Jenkinsfile文件,添加SonarQube代码审查阶段
pipeline {
agent any
stages {
stage('pull code') {
steps {
checkout([$class: 'GitSCM', branches: [[name: '*/${branch}']], extensions: [], userRemoteConfigs: [[credentialsId: '9a04c4aa-6116-4246-82c3-dbfc2c8bc2d5', url: 'git@192.168.23.201:zhangsan/web_demo.git']]])
}
}
stage('code checking') {
steps {
script {
//引入了sonarqube-scanner工具
scannerHome = tool 'sonar-scanner'
}
//引入了sonarqube服务器系统环境
withSonarQubeEnv('sonarqube') {
sh "${scannerHome}/bin/sonar-scanner"
}
}
}
stage('build project') {
steps {
sh 'mvn clean package'
}
}
stage('deploy item') {
steps {
deploy adapters: [tomcat8(credentialsId: '5cf315b3-86b3-43ca-b8d7-db867310f6e0', path: '', url: 'http://192.168.23.203:8080')], contextPath: '/', war: 'target/*.war'
}
}
}
post {
always {
emailext(
subject: '构建通知:${PROJECT_NAME} - Build # ${BUILD_NUMBER} - ${BUILD_STATUS}!',body: '${FILE,path="email.html"}', to: '3025391653@qq.com'
)
}
}
}