Jenkins之四-----基于Jenkins代码扫描及SonarQube使用

实战一:安装部署Sonarqube和使用

Sonarqube介绍

官网下载地址:https://www.sonarqube.org/downloads/

SonarQube是一个用于代码质量管理的开放平台,通过插件机制,SonarQube可以集成不同的测试工具,代码分析工具,以及持续集成工具,例如Hudson/Jenkins等。

sonarqube的七个维度检测代码质量:

  • 复杂度分布:代码复杂度过高将难以理解
  • 重复代码:程序中包含大量复制、粘贴的代码而导致代码臃肿,sonar可以展示源码中重复严重的地方
  • 单元测试统计:统计并展示单元测试覆盖率,开发或测试可以清楚测试代码的覆盖情况
  • 代码规则检查:检查代码是否符合规 范
  • 注释率:若代码注释过少,特别是人员变动后,其他人接手比较难接手;若过多,又不利于阅读
  • 潜在的 Bug :检测潜在的 bug
  • 结构与设计:找出循环,展示包与包、类与类之间的依赖、检查程序之间耦合度

Jenkins之四-----基于Jenkins代码扫描及SonarQube使用

1、安装部署sonarqube

sonar依赖于java环境,而且java版本必须是1.8版本或更高,否则sonar启动失败,6.7. X版本的sonar需要调用elasticsearch而且默认需要使用普通用户。

7.9.x版本不再支持MySQL:https://docs.sonarqube.org/latest/setup/upgrade-notes/

1、在官网上下载sonarrqube包,并将sonarqube的server安装包传到指定的/usr/local/src目录下

[root@jenkins-slave src]# ls
sonarqube-6.7.7.zip
[root@jenkins-slave src]# unzip sonarqube-6.7.7.zip  # 将sonarqube-server包进行解压
[root@jenkins-slave src]# ln -sv /usr/local/src/sonarqube-6.7.7 /usr/local/sonarqube # 最sonarqube server创建一个软链接
[root@jenkins-slave ~]# useradd -s /bin/bash sonarqube  # 创建一个sonarqube用户
[root@jenkins-slave yum.repos.d]# chown sonarqube.sonarqube /usr/local/src/sonarqube-6.7.7 /usr/local/sonarqube -R  #将两个目录文件的权限都改为sonarqube用户属组和属主

2、修改系统和内核参数

[root@jenkins-slave src]# vim /etc/sysctl.conf  # 修改系统内核参数
vm.max_map_count = 262144
fs.file-max = 65536

[root@jenkins-slave src]# sysctl -p  # 将内核参数生效

[root@jenkins-slave src]# vim /etc/security/limits.conf  # 修改限制文件链接大小
sonarqube - nofile 65536
sonarqube - nproc  2048

[root@jenkins-slave src]# useradd -s /bin/bash sonarqube # 创建一个sonarqube用户
[root@jenkins-slave src]# reboot  # 重启系统,使配置的参数生效

3、重启linux系统之后,然后切换至sonarqube用户查看参数是否生效

[sonarqube@jenkins-slave ~]$ ulimit -n
65536

[sonarqube@jenkins-slave ~]$ sysctl -a | grep fs.file-max
fs.file-max = 65536

[sonarqube@jenkins-slave ~]$ sysctl -a | grep vm.max_map_count
vm.max_map_count = 262144

2、安装并配置mysql-server-5.6版本数据库

数据库要使用5.6版本,不支持5.5的版本

参考文档:https://docs.sonarqube.org/6.7/Requirements.html

配置mysql-server-5.6版本数据库仓库文档:https://dev.mysql.com/doc/refman/5.6/en/linux-installation-yum-repo.html

1、配置mysql-5.6版本的仓库

# cat  /etc/yum.repos.d/mysql.repo
[mysql56-community]
name=MySQL 5.6 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.6-community/el/6/$basearch/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

2、安装mysql-server数据库,创建数据库,并对数据库授权

[root@jenkins-slave ~]# yum install mysql-server  -y  #安装数据库
[root@jenkins-slave ~]# systemctl start mysqld # 启动mysql数据库
[root@jenkins-slave yum.repos.d]# mysql  # 对数据库授权
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 10.3.10-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> create database sonar default character set utf8 collate utf8_general_ci; # 创建sonar数据库
Query OK, 1 row affected (0.001 sec)

MariaDB [(none)]> grant all privileges on sonar.* to 'sonar'@'192.168.7.%' identified by '123456';  #对sonar数据库授权
Query OK, 0 rows affected (0.001 sec)

3、在另一台主机上安装mysql客户端,进行测试mariadb数据库是否可以连接

[root@jenkins ~]# mysql -p123456 -usonar -h192.168.7.103  # 远程连接数据库
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 9
Server version: 10.3.10-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show databases;  #查看此时的数据库信息,里边有mariadb数据库新建的sonar数据库
+--------------------+
| Database           |
+--------------------+
| information_schema |
| sonar              |
+--------------------+
2 rows in set (0.001 sec)

3、安装JDK包

 官方下载JDK地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

JAVA依赖的环境:JDK-8版本就可以了。

Jenkins之四-----基于Jenkins代码扫描及SonarQube使用

1、下载JDK包,使用8版本的即可,并将下载的包解压,创建软链接

[root@tomcat-web1 src]# tar xvf jdk-8u212-linux-x64.tar.gz 
[root@tomcat-web1 src]# ln -sv /usr/local/src/jdk1.8.0_212/   /usr/local/jdk
‘/usr/local/jdk’ -> ‘/usr/local/src/jdk1.8.0_212/’

2、设置JDK环境变量,并生效

[root@tomcat-web1 src]# vim /etc/profile # 配置环境变量
export HISTTIMEFORMAT="%F %T `whoami`"
export export LANG="en_US.utf-8"
export JAVA_HOME=/usr/local/jdk
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin

[root@tomcat-web1 src]# . /etc/profile # 生效环境变量

3、对JDK的可执行程序创建软链接

[root@tomcat-web1 src]# ln -sv /usr/local/jdk/bin/java  /usr/bin/
‘/usr/bin/java’ -> ‘/usr/local/jdk/bin/java’

4、查看此时解压后的JDK版本

[root@tomcat-web1 src]# java -version
java version "1.8.0_212"
Java(TM) SE Runtime Environment (build 1.8.0_212-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.212-b10, mixed mode)

4、修改sonarqube配置文件

1、从root管理员账号切换至sonarqube账号,修改sonarqube的配置文件。

[root@jenkins-slave ~]# su - sonarqube  # 切换到sonarqube用户
[sonarqube@jenkins-slave src]$ vim /usr/local/src/sonarqube-6.7.7/conf/sonar.properties   # 修改sonarqube配置文件
sonar.jdbc.username=sonar
sonar.jdbc.password=123456
sonar.jdbc.url=jdbc:mysql://192.168.7.103:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerforman  # 192.168.7.103是本机的IP地址
ce&useSSL=false
sonar.web.host=0.0.0.0  # 默认允许访问的web主机IP地址
sonar.web.port=9000  #默认监听此端口

2、启动sonarqube服务,需要最少4G的内存才能运行起来

[sonarqube@jenkins-slave sonarqube-6.7.7]$ cd /usr/local/src/sonarqube-6.7.7  #切换到此目录下
[sonarqube@jenkins-slave sonarqube-6.7.7]$ ./bin/linux-x86-64/sonar.sh start # 启动sonarqube服务
Starting SonarQube...
Started SonarQube.

3、再打开一个窗口查看此时sonarqube运行状态

[sonarqube@jenkins-slave src]$ pwd
/usr/local/src
[sonarqube@jenkins-slave src]$ tail -f sonarqube-6.7.7/logs/*.log

Jenkins之四-----基于Jenkins代码扫描及SonarQube使用

此时监听的默认9000端口已经打开,如果此主机安装php,sonarqube将无法启动。

Jenkins之四-----基于Jenkins代码扫描及SonarQube使用

4、开始登陆sonarqube,默认的账号是admin 密码是admin,登陆网址是192.168.7.103:9000

Jenkins之四-----基于Jenkins代码扫描及SonarQube使用

5、登陆的第一件事,当然就是安装chinese中文插件,安装完中文包之后,需要重启sonarqube,此时sonarqube的部署已经完成!!!

Jenkins之四-----基于Jenkins代码扫描及SonarQube使用

6、重启sonarqube

[sonarqube@jenkins-slave sonarqube-6.7.7]$ pwd
/usr/local/src/sonarqube-6.7.7
[sonarqube@jenkins-slave sonarqube-6.7.7]$ bin/linux-x86-64/sonar.sh  restart #重启sonarqube
Stopping SonarQube...
Waiting for SonarQube to exit...
Stopped SonarQube.
Starting SonarQube...
Started SonarQube.

5、在jenkins主机上安装部署扫描器:sonar-scanner

sonar-scanner介绍

sonarqube通过调用扫描器 sonar scanner 进行代码质量分析,即扫描器的具体工作就是扫描代码:

1、在网站上下载sonar-scanner包,将此包放到jenkins服务器的/usr/local/src目录下,解压并创建软链接。

下载地址:https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/

官方文档:https://docs.sonarqube.org/latest/analysis/scan/sonarscanner/

Jenkins之四-----基于Jenkins代码扫描及SonarQube使用

[root@jenkins src]# pwd
/usr/local/src

[root@jenkins src]# unzip sonar-scanner-cli-4.0.0.1744-linux.zip  # 解压文件
[root@jenkins src]# ln -sv /usr/local/src/sonar-scanner-4.0.0.1744-linux/ /usr/local/sonnar-scanner  #创建软链接
‘/usr/local/sonnar-scanner’ -> ‘/usr/local/src/sonar-scanner-4.0.0.1744-linux/’

2、修改sonar-scanner配置文件

[root@jenkins sonar-scanner-4.0.0.1744-linux]# pwd
/usr/local/src/sonar-scanner-4.0.0.1744-linux
[root@jenkins sonar-scanner-4.0.0.1744-linux]# vim conf/sonar-scanner.properties 
sonar.host.url=http://192.168.7.103:9000  #监听sonarqube地址
sonar.sourceEncoding=UTF-8  #使用UTF-8字符集

3、此时切换到sonnar-scanner可执行程序目录下,此时的sonnar-scanner可执行程序需要在代码检测的目录下进行测试。

[root@jenkins bin]# cd /usr/local/sonnar-scanner/bin  #切换到可执行目录下
[root@jenkins bin]# ls
sonar-scanner-debug  sonar-scanner   # 其中sonar-scanner执行脚本需要在检测代码的目录下进行执行

6、准备测试代码

1、准备sonar-examples-master测试代码,将测试代码进行解压,最主要的是/usr/local/src/sonar-examples-master/projects/languages/php/php-sonar-runner目录下的配置文件sonar-project.properties、以及src目录下的源代码。 

[root@jenkins src]# unzip sonar-examples-master.zip  #解压测试代码
[root@jenkins php-sonar-runner]# pwd
/usr/local/src/sonar-examples-master/projects/languages/php/php-sonar-runner
[root@jenkins php-sonar-runner]# ls
README.md  sonar-project.properties  src  validation.txt #其中sonar-project.properties就是配置源代码的文件,src是源代码的目录                       
[root@jenkins php-sonar-runner-simple]# cat sonar-project.properties 
# Required metadata
sonar.projectKey=org.sonarqube:php-simple-sq-scanner  #自定义项目key,可以自己定义
sonar.projectName=Java :: Simple Project Not Compiled :: SonarQube Scanner  #自定义项目的名称,可以自己定义
sonar.projectVersion=1.0  #源代码版本

# Comma-separated paths to directories with sources (required)
sonar.sources=src  #源代码的目录

# Language
sonar.language=php #代码语言类型

# Encoding of the source files 
sonar.sourceEncoding=UTF-8 #默认的UTF-8字符类型

2、手动在当前项目代码目录执行扫描,以下是扫描过程的提示信息,扫描的配置文件sonar-project.propertie在每个项目都要有

[root@jenkins php-sonar-runner]# /usr/local/sonnar-scanner/bin/sonar-scanner

执行成功结果如下,显示成功才行。

Jenkins之四-----基于Jenkins代码扫描及SonarQube使用

3、此时登陆sonarqube网址,可以看到扫描代码的信息已经在此网页上显示192.168.7.103:9000

Jenkins之四-----基于Jenkins代码扫描及SonarQube使用

 

 实战二:Jenkins执行代码扫描

1、在Jenkins安装sonarqube-scanner插件

在系统管理---->插件管理,安装sonarqube-scanner插件

Jenkins之四-----基于Jenkins代码扫描及SonarQube使用

2、添加sonarqube URL:Jenkins--->系统管理----->系统设置---->SonarQube servers

Jenkins之四-----基于Jenkins代码扫描及SonarQube使用

3、在Jenkins添加扫描工具:Jenkins---->系统管理---->全局工具配置

指定扫描工具的绝对路径:

Jenkins之四-----基于Jenkins代码扫描及SonarQube使用

2、使用扫描工具对Jenkins脚本进行扫描

第一种方式:选择创建的项目或者自己重新创建项目,然后在构建里边“增加构建步骤",将扫描配置放到前面

扫描配置:

sonar.projectKey=job1-master
sonar.projectName=job1-master
sonar.projectVersion=1.0
sonar.sources=./
sonar.language=php
sonar.sourceEncoding=UTF-8

Jenkins上执行的脚本

cd /var/lib/jenkins/workspace/linux-jobs
tar cf code.tar.gz index.html
scp code.tar.gz  www@192.168.7.104:/data/tomcat/tomcat_appdir/ 
ssh www@192.168.7.104  "/apps/tomcat/bin/shutdown.sh && rm -rf /data/tomcat/tomcat_webdir/myapp/*  && cd /data/tomcat/tomcat_appdir/ && tar xf code.tar.gz -C /data/tomcat/tomcat_webdir/myapp/"
ssh www@192.168.7.104  "/apps/tomcat/bin/startup.sh"

Jenkins之四-----基于Jenkins代码扫描及SonarQube使用

 3、在Jenkins立即构建

Jenkins之四-----基于Jenkins代码扫描及SonarQube使用

4、查看Jenkins扫描代码到sonarqube服务的信息,此时实验成功!

Jenkins之四-----基于Jenkins代码扫描及SonarQube使用

 第二种方式:

 1、将测试代码的配置代码文件和源码目录传达gitlab上

#git clone http://192.168.7.100/linux_gitlab/web1.git #先在gitlab克隆一个项目目录及代码,用来在项目目录下上传代码
[root@jenkins web1]# cd /usr/local/src/sonar-examples-master/projects/languages/php/php-sonar-runner/ # 切换到测试的代码目录下
[root@jenkins php-sonar-runner]# cp -r src web1 # 源代码目录复制到web1项目下
[root@jenkins php-sonar-runner]# cp sonar-project.properties  web1  # 配置代码文件复制到web1目录下

[root@jenkins php-sonar-runner]# cat sonar-project.properties   #查看代码配置文件信息
# Required metadata
sonar.projectKey=linux-php
sonar.projectName=linux-php
sonar.projectVersion=1.0

# Comma-separated paths to directories with sources (required)
sonar.sources=src

# Language
sonar.language=php

# Encoding of the source files
sonar.sourceEncoding=UTF-8

[root@jenkins web1]# git config --global user.email 97212253@qq.com"  #进行登陆验证
[root@jenkins web1]# git config --global user.email jenkins  #登陆gitlab验证
[root@jenkins web1]# git add ./*  # 添加代码及扫描配置文件
[root@jenkins web1]# git commit -m "v2" #提交
[root@jenkins web1]# git push  #上传代码和扫描配置文件

查看上传到gitlab的代码及配置文件

Jenkins之四-----基于Jenkins代码扫描及SonarQube使用

2、指定代码路径和凭证

Jenkins之四-----基于Jenkins代码扫描及SonarQube使用

3、执行shell脚本,切换到克隆下来的代码路径,然后对其代码进行扫描

Jenkins之四-----基于Jenkins代码扫描及SonarQube使用

 4、立即构建

Jenkins之四-----基于Jenkins代码扫描及SonarQube使用

 5、在sonarqube控制台可以看到代码扫描的结果,第二种方法试验成功!

Jenkins之四-----基于Jenkins代码扫描及SonarQube使用

 

 

 

 

 

 

 

 

 

  

 

 

 

 

 

 

 

 

 

  

 

上一篇:Sonar 4.2在同一个项目中分析Java和JavaScript


下一篇:sonar的安装以及使用