从零打造属于自己的CI/CD Jenkins+SonarQube(一)

SonarQube 介绍

SonarQube 是一个开源的代码质量分析平台,便于管理代码的质量,可检查出项目代码的漏洞和潜在的逻辑问题。同时,它提供了丰富的插件,支持多种语言的检测,如 Java、Python、Groovy、C、C++等几十种编程语言的检测。

它主要的核心价值体现在如下几个方面:

  • 检查代码是否遵循编程标准:如命名规范,编写的规范等。
  • 检查设计存在的潜在缺陷:SonarQube 通过插件 Findbugs、Checkstyle 等工具检测代码存在的缺陷。
  • 检测代码的重复代码量:SonarQube 可以展示项目中存在大量复制粘贴的代码。
  • 检测代码中注释的程度:源码注释过多或者太少都不好,影响程序的可读可理解性。
  • 检测代码中包、类之间的关系:分析类之间的关系是否合理,复杂度情况。

SonarQube特性:

  • 易于安装,开箱即可启动
  • 易于配置-所有配置可以通过其提供的web界面实现
  • 可以与CI系统,例如jenkins完美集成
  • 丰富的扫描规则,支持自定义,并可以集成findbugs,pmd,checkstyle等插件
  • 丰富的格式支持,可以扫描java\js\xml\jsp等多种格式
  • 丰富的统计功能
  • 支持违规的处理、分配等工作流
  • 可以对违规进行确认,误报的违规一次确认后将不再统计在内
  • 支持maven\ant\命令行等方式扫描

架构原理

在这里插入图片描述

SonarQube 平台是由 4 个部分组成:

  • SonarQube Server
  • SonarQube Database
  • SonarQube Plugins
  • SonarQube Scanner

本篇介绍通过 Docker 来安装。大概的一个运作流程是这样的,先通过 Sonar-Scanner 插件扫描代码,把数据存储到数据库,SonarQube 读取数据库,将数据库展现在 Web 平台。

部署 Mysql 数据库

1、先拉取 Mysql 镜像(sonarqube:7.4 不支持 Mysql:5.7 以上)

docker pull mysql:5.7

2、创建工作目录,为接下来的挂载自定义映射路径做准备

mkdir -p /Users/xxxxx/data/mysql/conf
mkdir -p /Users/xxxxx/data/mysql/logs
mkdir -p /Users/xxxxx/data/mysql/data

3、创建网络

docker network create my-mysql-network

4、创建Mysql容器并运行

docker run --name mysql -d -p 3306:3306 --net my-mysql-network -v /Users/xxxxx/data/mysql/conf:/etc/my.cnf.d -v 
/Users/xxxxx/data/mysql/logs:/logs -v 
/Users/xxxxx/data/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--restart always \
--privileged=true \
--network-alias mysql \
mysql:5.7

详解:
-p 3306:3306:将容器 3306 映射到宿主机端口 3306
-v /Users/xxxxx/data/mysql/conf:/etc/my.cof.d:将容器下的 /etc/my.cof.d 挂载到宿主机 /Users/xxxxx/data/mysql/conf
-e MYSQL_ROOT_PASSWORD=123456:设置 root 密码 123456
--restart always:容器退出时总是重启
--privileged=true:挂载主机目录Docker访问出现Permission denied的解决办法
--net my-mysql-network:容器接入自定义网络
--network-alias mysql:给容器起个网络别名

5、查看容器是否运行正常

6、允许外网访问

进入容器: docker exec -it mysql /bin/bash

操作mysql:
mysql -uroot -p  # 密码 123456
GRANT ALL ON *.* TO 'root'@'%';  # 所有网络都可访问
create database sonar;           # 创建 sonarqube 数据库

# 添加远程登录用户:sonar ,并授予权限。
CREATE USER 'sonar'@'%' IDENTIFIED WITH mysql_native_password BY 'sonar';  
GRANT ALL PRIVILEGES ON *.* TO 'sonar'@'%';

flush privileges;    # 刷新权限

7、使用 Navicat 连接 Mysql 数据库

部署 SonarQube

1、拉取 SonarQube 镜像

 docker pull docker pull sonarqube:7.4-community

2、创建工作目录 

mkdir -p /Users/xxxxx/data/sonarqube

3、运行一个 test 容器

docker run -d --name sonartest sonarqube:7.4-community

4、将容器内重要文件复制到宿主机

docker cp sonartest:/opt/sonarqube/conf /Users/xxxxx/data/sonarqube
docker cp sonartest:/opt/sonarqube/data /Users/xxxxx/data/sonarqube
docker cp sonartest:/opt/sonarqube/logs /Users/xxxxx/data/sonarqube
docker cp sonartest:/opt/sonarqube/extensions /Users/xxxxx/data/sonarqube

5、然后删除此容器

docker rm sonartest

6、修改文件夹权限

chmod -R 777 /Users/xxxxx/data/sonarqube/

7、部署容器并运行( sonarQube + Mysql)

docker run -d --name sonar -p 9090:9000 \    
 -e SONARQUBE_DATABASE_USER=sonar \
 -e SONARQUBE_DATABASE_NAME=sonar \
 -e SONARQUBE_DATABASE_PASSWORD=sonar \
 -e SONARQUBE_JDBC_URL="jdbc:mysql://0.0.0.0:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false" \
 --net my-mysql-network \
 --privileged=true \
 -v /Users/xxxxx/data/sonarqube/logs:/opt/sonarqube/logs \
 -v /Users/xxxxx/data/sonarqube/conf:/opt/sonarqube/conf \
 -v /Users/xxxxx/data/sonarqube/data:/opt/sonarqube/data \
 -v /Users/xxxxx/data/sonarqube/extensions:/opt/sonarqube/extensions\
 sonarqube:7.4-community 

详解:
 -e SONARQUBE_DATABASE_USER=sonar: 远程用户名
 -e SONARQUBE_DATABASE_NAME=sonar: 数据库名称
 -e SONARQUBE_DATABASE_PASSWORD=sonar: 远程用户密码
 -e SONARQUBE_JDBC_URL="jdbc:mysql://0.0.0.0:3306/sonar: 连接 sonar 数据库
 --net my-mysql-network: 容器接入自定义网络
 --privileged=true: 挂载主机目录Docker访问出现Permission denied的解决办法
 -v /Users/xxxxx/data/sonarqube/logs:/opt/sonarqube/logs: 将容器下的 /opt/sonarqube/logs 挂载到宿主机 /Users/xxxxx/data/sonarqube/logs

8、查看日志

docker logs -f sonar

9、日志内出现以下日志数据 sonarqube 初始化成功

注意:初始化安装过程教程,过程中会安装一些必须依赖。耐心等待。。。

悄咪咪说一句:基本上一次就能安装成功,望君加油!!!!

10、初始化成功后,浏览器输入http://ip:9090,默认账号密码:admin

注意:打开 sonar 页面建议不要使用 http://0.0.0.0:9090 或者 http://127.0.0.1:9090

创建项目

1、创建项目领取令牌

2、分析项目选择项目语言以及操作系统和填写任务标识

3、下载 SonarScanner 

下载地址:https://docs.sonarqube.org/latest/analysis/scan/sonarscanner/

4、下载扫描工具,根据您的操作系统,选择对应的版本

配置 SonarScanner 环境变量

1、进行解压缩

2、进入 sonar-scanner 文件夹内,获取 bin 目录的绝对路径

3、添加环境变量

使用 vi /etc/profile 命令 把 bin 的绝对路径添加到环境变量内

注意:不要添加到 ~/.bash_profile 内,否则环境变量老是失效

#sonarqube path
SONAR_SCANNER_HOME=/Users/xxxxx/data/sonarqube/sonar-scanner-4.7.0.2747-macosx
export PATH=$SONAR_SCANNER_HOME/bin:$PATH

4、使用以下命令生效 环境变量

source /etc/profile

5、查看环境变量是否配置成功

sonar-scanner -v

出现以下提示,说明环境变量配置成功

扫描代码

1、复制扫描代码指,修改对应的代码文件夹路径

 2、粘贴执行扫描

扫描过程较慢。耐心等待。。。。。

 出现以下报告,说明扫描成功

3、登陆管理控制台查看扫描结果

Jenkins集成SonarQube

在这里插入图片描述

  • 开发工具 sonarlint实时分析
  • 代码上传仓库git、svn等
  • 持续集成服务jenkins使用SonarQube scanners进行代码分析
  • 代码分析报告发送至SonarQube server
  • SonarQube server将分析结果存入SonarQube database数据库
  • SonarQube server界面UI展示代码问题,交由开发者管理处理问题
  • SonarQube server提供代码分析报告

Jenkins操作

1、下载插件

插件管理内搜索 SonarQube Scanner 点击 install without restart

如果多次下载失败,就手动下载插件,手动上传该插件

插件下载地址:Jenkins Plugins

 点击 2.14 版本名称进行下载

上传插件

 2、设置 SonarQube servers

系统配置-找到 SonarQube servers 点击 Add SonarQube

name:随意写

Server URL:填写 SonarQube 服务器地址

添加 Server authentication token

 类型选择:Secret text

Secret填写:项目令牌

选择添加的 token

3、Jenkins 容器内安装 SonarQube Scanner

1.创建 sonar-demo 项目

2.下载 SonarQube Scanner

地址:SonarScanner | SonarQube Docs

选择 Linux 64-bit 类型

 把 sonar-scanner-cli-4.7.0.2747-linux.zip 复制 Jenkins 容器内

详解:
docker cp 压缩文件 b8ebff36b8ed:/var/jenkins_home/workspace/sonar-demo 复制 sonar 压缩包到 Jenkins 的 /var/jenkins_home/workspace/sonar-demo内

为啥要这样复制。因为 /var/jenkins_home 与本地 data/jenkins_home进行宿主机挂载了

 解压 sonar-scanner-cli-4.7.0.2747-linux.zip 文件,并找到 bin目录绝对路径 

3.下载 /etc/profile 到本地

注意:因 Jenkins 容器内未配置 vi/vim 命令,所以配置环境变量不能使用 vi/vim 命令 ,只有把 /etc/profile 文件复制到本地,然后添加 sonar-scanner 环境变量添加完成后,再上传到容器内。

/etc/profile 内添加 sonar-scanner 文件夹 bin 绝对路径

4.上传 /etc/profile 到Jenkins 容器内

Jenkins容器内查看 profile 内容

5.生效 环境变量

source /etc/profile

6.容器内查看环境变量是否配置成功

sonar-scanner -v

出现以下提示,说明环境变量配置成功

4、Jenkins 容器内扫描代码

扫描过程较慢。耐心等待。。。。。

 出现以下报告,说明扫描成功

5、Jenkins 内配置 SonarQube Scanner

全局工具配置找到 SonarQube Scanner 点击 新增SonarQube Scanner

Name:随意写

SONAR_RUNNER_HOME:容器内 SonarQube Scanner 绝对路径与 /etc/profile 里面填写的 SonarQube Scanner 保持一致

6、Jenkins 内配置 sonar-demo 项目

增加构建步骤选择 Execute SonarQube Scanner

JDK:选择 已有的 名称

Analysis properties:填写构建信息

# unique project identifier (required)
sonar.projectKey=test-local   #唯一项目标识符(必需)

# project metadata (used to be required, optional since SonarQube 6.1)
sonar.projectName=test-local #项目名称
sonar.projectVersion=1.0     #版本

# path to source directories (required)
sonar.sources=/var/jenkins_home/workspace/sonar-demo #路径到源目录,⚠️这个要写正确

# path to test source directories (optional)
sonar.tests=

# path to Java project compiled classes (optional)
sonar.java.binaries=

# comma-separated list of paths to libraries (optional)
sonar.java.libraries=

# Additional parameters
sonar.my.property=

7、Jenkins 构建 sonar-demo 项目 

 点击 SonarQube 查看内容

为啥是项目总览是空的呢!因为构建的时候,源目录下面没有任何代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值