Jenkins之四-----基于Jenkins代码扫描及SonarQube使用
实战一:安装部署Sonarqube和使用
Sonarqube介绍
官网下载地址:https://www.sonarqube.org/downloads/
SonarQube是一个用于代码质量管理的开放平台,通过插件机制,SonarQube可以集成不同的测试工具,代码分析工具,以及持续集成工具,例如Hudson/Jenkins等。
sonarqube的七个维度检测代码质量:
- 复杂度分布:代码复杂度过高将难以理解
- 重复代码:程序中包含大量复制、粘贴的代码而导致代码臃肿,sonar可以展示源码中重复严重的地方
- 单元测试统计:统计并展示单元测试覆盖率,开发或测试可以清楚测试代码的覆盖情况
- 代码规则检查:检查代码是否符合规 范
- 注释率:若代码注释过少,特别是人员变动后,其他人接手比较难接手;若过多,又不利于阅读
- 潜在的 Bug :检测潜在的 bug
- 结构与设计:找出循环,展示包与包、类与类之间的依赖、检查程序之间耦合度
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版本就可以了。
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
此时监听的默认9000端口已经打开,如果此主机安装php,sonarqube将无法启动。
4、开始登陆sonarqube,默认的账号是admin 密码是admin,登陆网址是192.168.7.103:9000
5、登陆的第一件事,当然就是安装chinese中文插件,安装完中文包之后,需要重启sonarqube,此时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/
[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
执行成功结果如下,显示成功才行。
3、此时登陆sonarqube网址,可以看到扫描代码的信息已经在此网页上显示192.168.7.103:9000
实战二:Jenkins执行代码扫描
1、在Jenkins安装sonarqube-scanner插件
在系统管理---->插件管理,安装sonarqube-scanner插件
2、添加sonarqube URL:Jenkins--->系统管理----->系统设置---->SonarQube servers
3、在Jenkins添加扫描工具:Jenkins---->系统管理---->全局工具配置
指定扫描工具的绝对路径:
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"
3、在Jenkins立即构建
4、查看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的代码及配置文件
2、指定代码路径和凭证
3、执行shell脚本,切换到克隆下来的代码路径,然后对其代码进行扫描
4、立即构建
5、在sonarqube控制台可以看到代码扫描的结果,第二种方法试验成功!