Jenkins集成 SonarQube

一、SonarQube基本概述

1.1 什么是SonarQube

SonarQube 是一个开源的代码质量管理系统,用于检测代码中的错误、漏洞。它可以与 Jenkins 集成,让我们
能自动化进行代码质量扫描。
在这里插入图片描述

1.2 使用Sonarqube环境

1.SonarQube基于Java开发,所以需要安装 OpenJDK8 版本。
2.SonarQube需要依赖 MySQL 数据库,至少 5.6 版本以上。
3.SonarQube的小型实例至少需要4GB 内存,如果是大型实例需要 16GB

1.3 SonarQube服务安装

1.3.1 环境准备

[root@sonarqube ~]# systemctl stop firewalld

[root@sonarqube ~]# systemctl disable firewalld
[root@sonarqube ~]# setenforce 0
setenforce: SELinux is disabled
[root@sonarqube ~]# yum install git java unzip wget -y

1.3.2 安装mysql数据库

1.安装 MySQL5.6 版本数据库

wget  --no-check-certificate https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql56-community-el7/mysql-communityserver-5.6.45-2.el7.x86_64.rpm
wget https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql56-community-el7/mysql-communityclient-5.6.45-2.el7.x86_64.rpm
wget https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql56-community-el7/mysql-communitycommon-5.6.45-2.el7.x86_64.rpm
wget https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql56-community-el7/mysql-communitylibs-5.6.45-2.el7.x86_64.rpm
[root@sonarqube ~]# yum localinstall mysql-community-*

2.创建sonar库

[root@sonarqube ~]# mysql -uroot -p123456 -e "create database sonar charset utf8;"
[root@sonarqube ~]# mysql -uroot -p123456 -e "show databases;"
Warning: Using a password on the command line interface can be insecure.
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sonar              |
+--------------------+

1.3.3 安装sonarqube

1.下载 sonarqube,并安装解压至 /usr/local

wget https://binaries.sonarsource.com/Distributi on/sonarqube/sonarqube-7.0.zip
[root@sonarqube ~]# unzip sonarqube-7.0.zip -d /usr/local
[root@sonarqube ~]# ln -s /usr/local/sonarqube-7.0/ /usr/local/sonarqube

2.修改 sonarqube 连接数据库配置文件

sonar.jdbc.username=root
sonar.jdbc.password=123456
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false

1.3.4 启动Sonarqube

启动 sonarqube 服务需要使用普通用户运行;如果使用root 则会启动失败;

[root@sonarqube ~]# useradd sonar
[root@sonarqube ~]# chown -R sonar.sonar /usr/local/sonarqube-7.0/

[root@sonarqube ~]# su - sonar -c "/usr/local/sonarqube/bin/linux-x86-64/sonar.sh start"

1.3.5 访问Sonarqube

1.通过浏览器输入 http://hostname:9000地址来访问sonarqube
点击登录–>输入用户名:admin 用户密码:admin
在这里插入图片描述
在这里插入图片描述
3.如何使用 SonarQube 质量分析;java 代码直接通过mvn即可分析;

mvn sonar:sonar \
  -Dsonar.host.url=http://sonar.bertwu.net:9000 \
  -Dsonar.login=a5eba929217499d5f17d15dbe750a39f4360ad32

4.如何使用SonarQube质量分析;非 java 代码则需要使用 sonar-scanner工具分析;

在这里插入图片描述

/usr/local/sonar-scanner/bin/sonar-scanner \
  -Dsonar.projectKey=html \
  -Dsonar.sources=. \
  -Dsonar.host.url=http://sonar.bertwu.net:9000 \
  -Dsonar.login=a5eba929217499d5f17d15dbe750a39f4360ad32

1.4 Sonarqube插件管理

Sonarqube默认已经安装了 C Java Python Php 等代码的质量分析工具;那我们为什么还需要安装插件?因为我们还需要检测 html等类型代码,而默认插件没有,所以需要安装;以便将代码检测的更加完善;

扫描二维码关注公众号,回复: 13238735 查看本文章

1.4.1 联网安装插件

联网安装插件比较简单,仅需要上应用市场搜索插件名称即可,如下以安装中文语言包插件为例;点击Administration > Marketplace --> 搜索框chinese,出现一个Chinese Pack,然后点击
install安装好的插件会存储至
usr/local/sonarqube/extensions/plugins/xx.jar
在这里插入图片描述

1.4.2 离线安装插件

由于 SonarQube 需要安装很多的插件,并且插件安装需要很长的时间;所以我们可以通过导入的方式来完成插件的安装;注意导入后需要重启 Sonarqube

[root@sonarqube ~]# rm -rf /usr/local/sonarqube/extensions/plugins/
[root@sonarqube ~]# tar xf sonar_plugins.tar.gz -C /usr/local/sonarqube/extensions
[root@sonarqube ~]# chown -R sonar.sonar /usr/local/sonarqube/extensions/plugins/
[root@sonarqube ~]# su - sonar -c "/usr/local/sonarqube/bin/linux-x86-64/sonar.sh restart"

二 、SonarQube代码检测

前面已经将 SonarQube服务以及插件安装完成,那么接下来只需要将代码推送至 Sonarqube 进行分析即可。

2.1 JAVA项目分析

Sonarqube 分析 JAVA 项目;进入项目目录,使用 mvn命令将代码直接推送至 Sonarqube 分析;

mvn sonar:sonar \
  -Dsonar.host.url=http://sonar.bertwu.net:9000 \
  -Dsonar.login=a5eba929217499d5f17d15dbe750a39f4360ad32 \
  -Dsonar.java.binaries=target/sonar

2.2 HTML项目分析

Sonarqube 分析 Html、php、go 项目;需要借助sonar-scanner客户端工具来完成代码的分析;
需要在项目所在的主机安装sonar-scanner
1.安装 sonar-scanner 命令;sonar-scanner下载地址

[root@jenkins ~]# wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.0.0.1744-linux.zip
[root@jenkins ~]# unzip sonar-scanner-cli-4.0.0.1744-linux.zip -d /usr/local/
[root@jenkins ~]# ln -s /usr/local/sonar-scanner-4.0.0.1744-linux/ /usr/local/sonar-scanner

2.进入项目目录,使用 sonar-scanner 工具将代码推送Sonarqube 服务端进行分析;如果没有加入环境变量,则建议使用绝对路径

/usr/local/sonar-scanner/bin/sonar-scanner \
  -Dsonar.projectKey=html \
  -Dsonar.sources=. \
  -Dsonar.host.url=http://sonar.bertwu.net:9000 \
  -Dsonar.login=a5eba929217499d5f17d15dbe750a39f4360ad32

3.登陆 Sonarqube 查看项目分析结果;
在这里插入图片描述

三、Jenkins集成SonarQube

Jenkins 需要知道 Sonarqube 服务;以便能将代码推送指定服务节点;
Jenkins 需要知道 Sonar-Scanner 客户端工具,以便能正常调用

3.1 集成Sonarqube

1.插件安装;系统管理–>插件管理–>SonarQube Scanner for Jenkins
在这里插入图片描述
2.在 Jenkins 上配置 SonarQube 服务端地址;系统管理–>系统配置–>sonarQube (告诉jenkins
SonarQubeServers服务端地址)
Name 可以随意填写
URL 添加 SonarQube服务端地址;确保Jenkins能正
常访问;
在这里插入图片描述

在这里插入图片描述
如果 SonarQube 没有在配置->通用设置->权限->启用Force user authentication 则可忽略token 验证

3.2 集成Sonar-Scanner

在 Jenkins 上配置 Sonar-Scanner 客户端工具路径; 系统管理–>全局工具配置–>sonar-scanner(告诉jenkins SonarScanner在本地哪个路径)
1.Name 可以随意填写,但最好有规范
2.SONAR_RUNNER_HOME 填写 sonar-scanner 在Jenkins本地路径
在这里插入图片描述

3.3 Jenkins为项目添加测试阶段

1.java项目 maven质检方式
在这里插入图片描述
2.java项目 Scanner质检方式

sonar.projectName=${
    
    JOB_NAME} #项目在sonarqube上的显示名称
sonar.projectKey=${
    
    JOB_NAME} #项目的唯一标识,不能重复
sonar.sources=. #扫描哪个项目的源码
sonar.java.binaries=target/sonar

在这里插入图片描述
推荐用scanner方式质检

  1. html项目Scanner质检方式
    在这里插入图片描述
    这样配置后,每次项目CI时候,先会进行质量检测,并将结果传送至SonarQube服务器。

四、Jenkins为项目添加通知阶段

4.1 配置钉钉

1.打开钉钉群组,点击设置–智能群助手–群机器人–添加机人–自定义机器人。(如果你不是群主,且群主开启了仅群主可管理,那么将无法创建机器人。)
2.添加一个自定义机器人
3.可以修改机器人名称,以及机器人的名字。(这块自行修改)
4.机器人修改成功后,会给出一个webhook地址。(此处的webhook后续jenkins需要使用)
在这里插入图片描述
在这里插入图片描述

https://oapi.dingtalk.com/robot/send?access_token=3e7e83379717a4bd052a928864d7bd1fbaa9df93aa473cc3b0f1c844aeea4996

4.2 Jenkins集成钉钉

1.Jenkins安装dingding插件。
在这里插入图片描述
在这里插入图片描述

2.配置钉钉机器人
系统管理----系统配置
在这里插入图片描述

4.3 为项目添加通知

4.3.1 .CI阶段通知质检结果

质检通知相对繁琐,需要自定义环境变量
1.启用钉钉机器人

在这里插入图片描述
在这里插入图片描述

2.编写质量检查脚本获取相关的值

[root@jenkins scripts]# cat dingding.sh 
# 调用查询异常状态接口函数,该接口是在SonarQube平台直接爬的
function issues() {
    
    
   # 如果sonar启用了强制认证,可以通过添加 -u username:password 进行校验
  curl -sH "Content-Length:0" -X GET "http://10.0.0.130:9000/api/issues/search?resolved=false&facets=severities%2Ctypes&componentKeys=$1"
}

# 类型
for i in {
    
    0..2}
do
  a=`issues $1 | jq '.facets[1].values['${
    
    i}'].val'`

  if [ ${
    
    a} = '"BUG"' ]
  then
    BUG=$(echo "BUG:`issues $1 | jq '.facets[1].values['${i}'].count'`个")
    N_BUG=`issues $1 | jq '.facets[1].values['${
    
    i}'].count'`
  fi

  if [ ${
    
    a} = '"VULNERABILITY"' ]
  then
    VULNERABILITY=$(echo "漏洞:`issues $1 | jq '.facets[1].values['${i}'].count'`个")
    N_VULNERABILITY=`issues $1 | jq '.facets[1].values['${
    
    i}'].count'`
  fi

  if [ ${
    
    a} = '"CODE_SMELL"' ]
  then
    CODE_SMELL=$(echo "异味:`issues $1 | jq '.facets[1].values['${i}'].count'`个")
  fi
done

# 严重程度
for i in {
    
    0..4}
do
  b=`issues $1 | jq '.facets[0].values['${
    
    i}'].val'`

  if [ ${
    
    b} = '"MINOR"' ]
  then
     MINOR=$(echo "次要:`issues $1 | jq '.facets[0].values['${i}'].count'`个")
  fi

  if [ ${
    
    b} = '"MAJOR"' ]
  then
     MAJOR=$(echo "主要:`issues $1 | jq '.facets[0].values['${i}'].count'`个")
  fi

  if [ ${
    
    b} = '"CRITICAL"' ]
  then
    CRITICAL=$(echo "严重:`issues $1 | jq '.facets[0].values['${i}'].count'`个")
  fi

  if [ ${
    
    b} = '"INFO"' ]
  then
    INFO=$(echo "提示:`issues $1 | jq '.facets[0].values['${i}'].count'`个")
  fi

  if [ ${
    
    b} = '"BLOCKER"' ]
  then
  BLOCKER=$(echo "阻断:`issues $1 | jq '.facets[0].values['${i}'].count'`个")
  fi
done
# 如何将脚本的结果定义为系统变量,供钉钉调用 https://www.it1352.com/1470666.html
echo "BUG=${BUG}" > ${
    
    WORKSPACE}/build
echo "VULNERABILITY=${VULNERABILITY}" >> ${
    
    WORKSPACE}/build
echo "CODE_SMELL=${CODE_SMELL}" >> ${
    
    WORKSPACE}/build 
echo "CRITICAL=${CRITICAL}" >> ${
    
    WORKSPACE}/build

3.jenkins中安装env插件
在这里插入图片描述

4.需要在Jenkins中定义环境变量
在这里插入图片描述
5.钉钉通知结果验证
在这里插入图片描述

4.3.2 .CD阶段通知质检结果

相对简单,可以用系统环境变量
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
CI/CD整体测试流程
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_46090675/article/details/120961787