Jenkins+SonarQube 代码审查

Jenkins+SonarQube 代码审查

SonarQuba 简介

SonarQube是一个用于管理代码质量的开放平台,可以快速的定位代码中潜在的或者明显的错误。目前 支持java,C#,C/C++,Python,PL/SQL,Cobol,JavaScrip,Groovy等二十几种编程语言的代码质量管理与检 测,底层使用elasticsearch作为代码检索工具。sonarquba从gitlab获取代码,然后,审查后,将结果保存在数据库中

官网:https://www.sonarqube.org/

安装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数据库里创建的库名一致

image-20220218094758229

image-20220218095152259

image-20220218095827915

启动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登录

image-20220218100651882

用户/密码 admin/admin

image-20220218100804314

输入任意令牌,生成加密码,并保存

09b58b5d4acfdc521c8cabe65ab622bbcc73458e

image-20220218100925138

image-20220218101014193

语言选择Java--->Maven,然点击完成

image-20220218101146351

界面如下

image-20220218101214886

配置Jenkins支持sonarQube代码审查

jenkins 安装SonarQube Scanner插件

image-20220218101422659

在jenkins的全局工具配置里,配置sonarquba

Manager Jenkins----> Global Tool Configuration

image-20220218101522445

SonarQube Scanner ----> Add SonarQube Scanner

image-20220218101556934

Name: sonar-scanner ;勾选Install automatically; 版本选择最新版

添加SonarQube凭证

Manager Jenkins --> Manager Credentials

image-20220218102222619

global ---> Add Credentials

image-20220218102300476

image-20220218102312741

kind:Secret test ;Secret:输入令牌的加密码 ;Description:输入一个简明扼要的名称

image-20220218102650113

Jenkins在系统配置里,配置SonarQube

Manager Jenkins----> Configure System

image-20220218103116845

SonarQube installations---->Add SonarQube--->配置名称,sonarqube服务器地址,凭证

image-20220218103219318

image-20220218103419574

建立自由风格项目,验证sonarquba

在项目的配置文件中,添加构建步骤

在项目的配置文件中,添加构建步骤,选择Execute SonarQube Scanner

image-20220218103806802

配置sonarqube 构建步骤

image-20220218104655009

image-20220218104424694

image-20220218104854028

构建,然后查看

image-20220218105116582

在项目的控制台输出,可以看到跳过扫描部分

image-20220218105230676

刷新sonarqube首页,可以看到代码审查的结果

image-20220218105841024

代码检查报错

如果代码检查报错,查看输出信息发现有如下的信息

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

image-20220218115144227

这是因为jenkins连接sonar出错,原因是token不对. 是否是复制token时多复制,或者少复制。

修改凭证后重新构建即可

测试错误代码

在项目的main 目录下,新建目录java和resources

image-20220218110412288

image-20220218110435699

image-20220218110504387

image-20220218110517726

修改配置文件pom.xml,添加对servlet的依赖

在配置文件pom.xml 里的dependencies 标签里,添加配置,然后导入配置.

image-20220218111003006

<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
  <version>4.0.1</version>
</dependency>

在java目录新建编写servlet文件

image-20220218111407874

文件名:com.mytest.HelloServlet. 这样会在java目录下创建com.mytest目录,然后在该目录下创建HelloServlet.java文件

image-20220218111520886

image-20220218111551972

在HelloServlet 编写代码

image-20220218112426219

image-20220218112454685

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

image-20220218112638842

image-20220218112706374


`提交并推送HelloServlet`

image-20220218112851472

image-20220218112912170

进行构建,测试结果

!image-20220218113529776

image-20220218113157467

image-20220218113355652

image-20220218113422742

image-20220218113452185

如果maven构建报错,可能是因为java版本不符

image-20220218113040997

解决方法:

image-20220218113050808

image-20220218113056665

image-20220218113105975

image-20220218113109442

再次提交项目

image-20220218113120076

image-20220218113125807

为流水线项目添加SonarQube代码审查

在项目根目录新建文件project.properties

image-20220218113709301

image-20220218113731990sonar-

image-20220218113957310

# 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代码审查阶段

image-20220218114257465

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'
                 )
             }
         }
}

把更改后的sonar-project.properties和Jenkinsfile进行提交

image-20220218114431875

image-20220218114448512

image-20220218114550438

image-20220218114607398

构建项目,查看结果

image-20220218114840793

image-20220218114916527

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值