Fork me on GitHub

SonarQube+jenkins打造质量集成管理流水线

一、介绍与安装

SonarQube 是一款用于代码质量管理的开源工具,它主要用于管理源代码的质量。 通过插件形式,可以支持众多计算机语言,比如 java, C#, go,C/C++, PL/SQL, Cobol, JavaScrip, Groovy 等。sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具来检测你的代码,帮助你发现代码的漏洞,Bug,异味等信息。 Sonar 不仅提供了对 IDE 的支持,可以在 Eclipse和 IntelliJ IDEA 这些工具里联机查看结果;同时 Sonar 还对大量的持续集成工具提供了接口支持,可以很方便地在持续集成中使用 Sonar。

二、安装SonarQube

1、环境准备
  • java环境
  • 数据库(支持SQL Server、Mysql、Oracle、PostgreSQL)
2、无数据库快速安装
#SonarQube 7.9及以后的版本不再支持MySQL
[root@localhost ~]# docker pull sonarqube:7.8-community
  • 快速安装

    这种方式启动sonarqube是没有数据存储的,docker重新加载后数据不会reload数据.

docker run -d --name sonarqube -p 9000:9000 -p 9092:9092 sonarqube:7.8-community
浏览器打开:0.0.0.0:9000
帐号密码:admin、admin
3、安装数据库

启动mysql官方页面: https://hub.docker.com/_/mysql?tab=description

  • 首先设置挂载权限

    需要修改目录权限,因为当映射本地数据卷时,/home/xyz/test/mysql/目录的拥有者为root用户,而容器中的jenkins user的uid为1000

[root@localhost ~]# chown -R 1000 /home/xyz/test/mysql/
  • docker启动mysql
[root@localhost ~]# docker run --name some-mysql -v /home/xyz/test/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123123 -d -p 8999:3306 mysql:5.7

#挂载目录更细
[root@localhost ~]#docker run \
	-d \
	-p 8999:3306 \
	--name mysql \
	-v /home/xyz/test/mysql/conf:/etc/mysql/conf.d \
	-v /home/xyz/test/mysql/logs:/logs \
	-v /home/xyz/test/mysql/data:/var/lib/mysql \
	-e MYSQL_ROOT_PASSWORD=123123 \
	mysql:5.7

注意:docker run -e  在容器内创建一个环境变量,这是宿主机向容器中传递信息的方法之一,在这里给mysql传递了-e MYSQL_ROOT_PASSWORD=123123,也就是初始密码123123
注意:sonarqube最低支持5.6版本
4、手动创建数据库
#进入容器
[root@localhost ~]# docker exec -it f0b9b606386d bash

#登录mysql
root@f0b9b606386d:/# mysql -uroot -p123123
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.28 MySQL Community Server (GPL)

mysql> show databases ;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.02 sec)

#创建数据库
mysql> create database db_sonar;
Query OK, 1 row affected (0.00 sec)

mysql> show databases ;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db_sonar           |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5、添加远程登录用户
#用户名为sonar,密码为sonar
mysql> CREATE USER 'sonar'@'%' IDENTIFIED WITH mysql_native_password BY 'sonar';
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT ALL PRIVILEGES ON *.* TO 'sonar'@'%';
Query OK, 0 rows affected (0.00 sec)
6、docker启动sonarqube
  • 启动sonarqube命名
[root@localhost ~]#docker run \
-d \
--name sonarqube \
-p 9000:9000 \
-p 9092:9092 \
--link=some-mysql:mysql \
-e SONARQUBE_JDBC_USERNAME=sonar \
-e SONARQUBE_JDBC_PASSWORD=sonar \
-e SONARQUBE_JDBC_URL="jdbc:mysql://192.168.31.5:8999/db_sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false" \
sonarqube:7.8-community

#--link=some-mysql:mysql
some-mysql是上面启动的0780av4容器的名字,这里作为源容器,mysql是该容器在link下的别名(alias),通俗易懂的讲,站在node容器的角度,some-mysql和mysql都是0780av4容器的名字,并且作为容器的hostname,node用这2个名字中的哪一个都可以访问到0780av4容器并与之通信。
  • 发现错误max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535] 
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
首先修改:
vi /etc/security/limits.conf
修改配置文件,在文件最后加入下面两个行。用户退出重新登录生效。
*               soft    nofile          65536
*               hard    nofile          65536
然后修改:
sudo sysctl -w vm.max_map_count=262144
注意:db_sonar数据库需要手动先创建,否则会报找不到。本地搭建ip地址不能写localhost,需要写内网ip。另外 SonarQube 7.9不再支持MySQL。
7、sonarqube登录及汉化
  • 默认登录账户信息
admin
admin
  • 在线安装汉化包

点击adminstration,然后点击marketplace,然后搜索chinese,安装。

  • 下载离线安装汉化包

下载地址:https://github.com/SonarQubeCommunity/sonar-l10n-zh/releases/tag/sonar-l10n-zh-plugin-1.28

  • 将主机的文件复制到容器中
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
#把下载好的jar包放在 /extensions/plugins/目录下
sonarqube@dfb52e9f7b13:/opt/sonarqube/extensions/plugins$docker cp ./sonar-l10n-zh-plugin-1.28.jar sonarqube:/opt/sonarqube/extensions/plugins
[root@localhost ~]# docker exec -it sonarqube bash
sonarqube@dfb52e9f7b13:/opt/sonarqube$ cd /opt/sonarqube/extensions/plugins
sonarqube@dfb52e9f7b13:/opt/sonarqube/extensions/plugins$ ls

README.txt				sonar-jacoco-plugin-1.0.1.143.jar	sonar-ruby-plugin-1.5.0.315.jar
sonar-auth-github-plugin-1.5.0.870.jar	sonar-java-plugin-5.13.0.18197.jar	sonar-scala-plugin-1.5.0.315.jar
sonar-auth-saml-plugin-1.1.0.181.jar	sonar-javascript-plugin-5.2.1.7778.jar	sonar-scm-git-plugin-1.8.0.1574.jar
sonar-csharp-plugin-7.14.0.8411.jar	sonar-kotlin-plugin-1.5.0.315.jar	sonar-scm-svn-plugin-1.9.0.1295.jar
sonar-css-plugin-1.1.0.993.jar		sonar-l10n-zh-plugin-1.28.jar		sonar-typescript-plugin-1.9.0.3766.jar
sonar-flex-plugin-2.4.0.1222.jar	sonar-ldap-plugin-2.2.0.608.jar		sonar-vbnet-plugin-7.14.0.8411.jar
sonar-go-plugin-1.1.1.2000.jar		sonar-php-plugin-3.1.1.4762.jar		sonar-xml-plugin-2.0.1.2020.jar
sonar-html-plugin-3.1.0.1615.jar	sonar-python-plugin-1.14.0.3086.jar
重新启动,汉化成功
8、代码扫描插件安装

比较高的版本默认会安装很多插件,若需求有变,可在插件市场中搜索下载。

三、安装sonar-scanner

1、安装sonar-scanner工具

请将sonar-scanner安装在jenkins服务上,因为jenkins拉取代码到本地后,再执行代码扫描

  • 下载sonar-scanner
[root@localhost ~]# wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.0.0.1744-linux.zip
  • 解压文件
#安装解压工具
[root@localhost ~]# yum install -y unzip zip

#解压文件
[root@localhost ~]# unzip sonar-scanner-cli-4.0.0.1744-linux.zip
  • 移到标准位置
[root@localhost ~]# mv sonar-scanner-4.0.0.1744-linux/ /usr/local
2、修改sonar-scanner配置文件
  • 建立软连接,方便用sonar-scanner的别名执行代码检测命令
[root@localhost ~]#ln -s /usr/local/sonar-scanner-4.0.0.1744-linux/ sonar-scanner
  • 修改配置文件sonar-scanner.properties
[root@localhost ~]# cd /usr/local/sonar-scanner-4.0.0.1744-linux/conf
[root@localhost conf]# vi sonar-scanner.properties
  • 以配置sonar用户名及密码方式连接
#----- Default SonarQube server
sonar.host.url=http://192.168.31.5:9000
 
#----- Default source code encoding
sonar.sourceEncoding=UTF-8
 
#----- 数据库用户名
sonar.jdbc.username=sonar
#----- 数据库密码
sonar.jdbc.password=sonar
#----- 数据库连接地址
sonar.jdbc.url=jdbc:mysql://192.168.31.5:8999/db_sonar?useUnicode=true&characterEncoding=utf8
 
#----- Sonar 用户名
sonar.login=admin
#----- Sonar 密码
sonar.password=admin
  • 以token方式配置并连接sonar
要以token方式配置并连接sonar,需要先开启访问权限

 然后,创建项目,生成token,复制并在sonar-scanner配置文件sonar-scanner.properties中

[root@localhost ~]# cd /usr/local/sonar-scanner-4.0.0.1744-linux/conf
[root@localhost conf]# vi sonar-scanner.properties
#----- Default SonarQube server
sonar.host.url=http://192.168.31.5:9000
#----- Sonar token登录
sonar.login= a380c2e12c6735dcb8550d5e6dae192265a97a15

#----- Default source code encoding
sonar.sourceEncoding=UTF-8
 
#----- 数据库用户名
sonar.jdbc.username=sonar
#----- 数据库密码
sonar.jdbc.password=sonar
#----- 数据库连接地址
sonar.jdbc.url=jdbc:mysql://192.168.31.5:8999/db_sonar?useUnicode=true&characterEncoding=utf8
3、修改环境变量
[root@localhost ~]# vi /etc/profile
在末尾环境变量处增加以下内容:
export SONAR_SCANNER_HOME=/usr/local/sonar-scanner-4.0.0.1744-linux
export PATH=$SONAR_SCANNER_HOME/bin:$PATH
配置生效
[root@localhost ~]# vi /etc/profilesource /etc/profile

四、代码检测

创建好项目,然后保存好生成的项目token,然后按照提示选择要生成的代码,最后生成代码分析命令。比如生成的python代码检查命令,如下所示:

 进入要检测的项目目录,然后执行下列命名:

[root@localhost ~]# cd /home/myprojects
[root@localhost myprojects]# ls
appium_xueqiu-master
执行代码扫描命名:
[root@localhost myprojects]#sonar-scanner \
  -Dsonar.projectKey=mytest \
  -Dsonar.sources=. \
  
 #在sonar-scanner配置文件sonar-scanner.properties中添加了token就不用再添加下列两行命令
  -Dsonar.host.url=http://192.168.31.5:9000 \
  -Dsonar.login=a380c2e12c6735dcb8550d5e6dae192265a97a15
结果:
INFO: ------------- Run sensors on project
INFO: Sensor Zero Coverage Sensor
INFO: Sensor Zero Coverage Sensor (done) | time=22ms
INFO: No SCM system was detected. You can use the 'sonar.scm.provider' property to explicitly specify it.
INFO: 9 files had no CPD blocks
INFO: Calculating CPD for 14 files
INFO: CPD calculation finished
INFO: Analysis report generated in 85ms, dir size=118 KB
INFO: Analysis report compressed in 35ms, zip size=47 KB
INFO: Analysis report uploaded in 52ms
INFO: ANALYSIS SUCCESSFUL, you can browse http://192.168.31.5:9000/dashboard?id=mytest
INFO: Note that you will be able to access the updated dashboard once the server has processed the submitted analysis report
INFO: More about the report processing at http://192.168.31.5:9000/api/ce/task?id=AXB11_OiIlo1wSAT3f3c
INFO: Analysis total time: 5.902 s
INFO: ------------------------------------------------------------------------
INFO: EXECUTION SUCCESS
INFO: ------------------------------------------------------------------------
INFO: Total time: 7.062s
INFO: Final Memory: 6M/27M
在服务器上查看结果:

 

 注意事项:

Java项目扫描 sonar-scanner.properties文件需要加一个自定义参数,不然会报错

 sonar.java.binaries=./target/classes

posted @   橘子偏爱橙子  阅读(69)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
历史上的今天:
2023-12-28 【工具篇】Kali下beef实战详细教程
2023-12-28 【靶场部署】kali系统安装
2021-12-28 【基础13】【自学笔记】python类的封装、继承、多态
点击右上角即可分享
微信分享提示