代码质量检查Sonarqube安装及Jenkins自动化集成

sonarqube是一款优秀的开源代码质量扫描与分析平台, 用来持续分析和评测项目源代码的质量。 通过SonarQube我们可以检测出项目中不规范的代码,重复代码, 潜在bug,安全性漏洞,单元测试覆盖率等问题, 并通过SonarQube web UI展示出来;
另外可以通过API及插件还可以与自动化工具集成,将代码扫描纳入整个自动化发布流程或开发质量管理流程中进行自动化管控;

版本说明: sonarqube从7.9开始,sonar不再支持mySql,转而支持postgreSql,本文我们将安装7.9.1版本。

1.安装PostgreSql

指定一台服务器,然后下载镜像,我们选择9.5版本(kong支持9.4以上版本的pg数据库)

  docker pull  docker.mirrors.ustc.edu.cn/library/postgres:9.5 #获取镜像
  mkdir /data/postgresql  #创建数据目录
  chmod 777 /data/postgresql  #授权目录
  docker run -p 5432:5432 -v /data/postgresql:/var/lib/postgresql/data -e POSTGRES_PASSWORD=123456 -e TZ=PRC -d --name=postgres  postgres:9.5

参数说明:
-p端口映射
-v将数据存到宿主机的映射目录
-e POSTGRES_PASSWORD 密码(默认用户名postgres)
-e TZ=PRC时区,中国
-d后台运行
--name容器名称

创建用户及sonar数据库
进入容器内

docker exec -it postgres /bin/bash
su root
su - postgres    #切换帐户
psql  #输入psql
 create user sonar with password '123456';
 create database sonar owner sonar;   #创建数据库指定所属者
\l;  #  \l查看数据库

2.安装Sonarqube

创建sonar.yaml文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: sonarqube
  labels:
    app: sonarqube
spec:
  replicas: 1
  selector:
    matchLabels:
      app: sonarqube
  template:
    metadata:
      labels:
        app: sonarqube
    spec:
      initContainers:
      - name: init-sysctl
#添加该镜像的目的是为了调用命令调整vm.max_map_count参数的值
        image: busybox
        imagePullPolicy: IfNotPresent
        command: ["sysctl", "-w", "vm.max_map_count=262144"]
        securityContext:
          privileged: true
      containers:
      - name: sonarqube
        image: 192.168.0.230:8083/sonarqube:7.9.1-community
        ports:
        - containerPort: 9000
        env:
        - name: SONARQUBE_JDBC_USERNAME
          value: "sonar"
        - name: SONARQUBE_JDBC_PASSWORD
          value: "123456"
        - name: SONARQUBE_JDBC_URL
          value: "jdbc:postgresql://192.168.0.230:5432/sonar"
        livenessProbe:
          httpGet:
            path: /sessions/new
            port: 9000
          initialDelaySeconds: 60
          periodSeconds: 30
        readinessProbe:
          httpGet:
            path: /sessions/new
            port: 9000
          initialDelaySeconds: 60
          periodSeconds: 30
          failureThreshold: 6
        resources:
          limits:
            cpu: 1000m
            memory: 2048Mi
          requests:
            cpu: 800m
            memory: 1024Mi
        volumeMounts:
        - mountPath: /opt/sonarqube/conf
          name: data
          subPath: conf
        - mountPath: /opt/sonarqube/data
          name: data
          subPath: data
        - mountPath: /opt/sonarqube/extensions
          name: data
          subPath: extensions
      volumes:
      - name: data
        hostPath: 
          path: /data/sonar
          type: Directory
---
apiVersion: v1
kind: Service
metadata:
  name: sonarqube
  labels:
    app: sonarqube
spec:
  type: NodePort
  ports:
    - name: sonarqube
      port: 9000
      targetPort: 9000
      nodePort: 30033
      protocol: TCP
  selector:
    app: sonarqube
#以下为ingress部分可选安装
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: sonarqube
spec:
  rules:
  - host: sonar.xxxx.cn
    http:
      paths:
      - path: /
        backend:
          serviceName: sonarqube
          servicePort: 9000

执行 kubectl apply -f sonar.yaml进行部署
注意如果您对资源限制过小,可能导致启动失败,sonarqube内置了elasticsearch,es是资源消耗大户,建议最低内存给1G,有条件可直接给16G。

        resources:
          limits:
            cpu: 1000m
            memory: 2048Mi
          requests:
            cpu: 800m
            memory: 1024Mi

部署完毕后,执行初始化:
http://k8s-ip:30033/setup
初始化后就可以看到我们默认的界面了,您可以登录管理,默认帐户密码为admin/admin
安装中文插件
默认sonar是英文版本,如果希望进行汉化则需要安装中文插件:
如果服务器能联网,则在线安装
在sonar页面上找到Administration > Marketplace,在搜索框中输入chinese,出现一个Chinese Pack,点击右侧的install按钮。
安装成功后,会提示重启 SonarQube 服务器。
稍等一会,再看页面上已经显示中文了。
如果服务器不能联网,则采用离线方式安装插件
下载地址:
https://github.com/SonarQubeCommunity/sonar-l10n-zh/releases/download/sonar-l10n-zh-plugin-1.16/sonar-l10n-zh-plugin-1.16.jar
将该jar包放到 sonarqube 7.9/extensions/plugins/目录中,如果plugins目录不存在,则自行创建一个。
可以docker exec -it dockerid /bin/bash进入容器上传,也可以直接宿主机/data/sonar/extensions/plugins/,该目录是yaml映射指定的。
文件复制后,重启sonar容器
笔者操作步骤如下:

cd /data/sonar/extensions
[root@k8s-node2 extensions]# ls
downloads
mkdir plugins
chmod 777 plugins
cd plugins
rz  #上传文件
docker restart xxxx  #重启容器

汉化后

安装其他插件
安装方法和上面中文插件安装一样,只是这些jar包相对难找。
整理了一部分插件共享给大家
链接:https://pan.baidu.com/s/1G7Quj8gLW9i8xyaXkH3C-w
提取码:tbul

名称 说明
sonar-java-plugin java源代码解析,计算指标等
sonar-csharp-plugin C#源码解析,计算指标
sonar-squid-java-plugin 检查潜在缺陷
sonar-checkstyle-plugin 检查代码编写风格
sonar-findbugs-plugin 检查潜在缺陷
sonar-pmd-plugin 检查潜在缺陷
sonar-surefire-plugin 执行单元测试
sonar-cobertura-plugin 统计代码覆盖率
sonar-jacoco-plugin 统计代码覆盖率
sonar-javascript-plugin JavaScript代码检查
sonar-python-plugin Python代码检查
sonar-web-plugin Web页面检查(HTML、JSP、JSF、Ruby、PHP等)
sonar-html-plugin Html检查工具
sonar-xml-plugin XML文件检查
sonar-scm-stats-plugin SCM源码库统计分析
sonar-metrics-plugin 文件度量
sonar-timeline-plugin 时间表显示度量结果
sonar-motion-chart-plugin 度量结果演进图
sonar-go-plugin go语言检查
sonar-vbnet-plugin vb.net检查
sonar-php-plugin PHP检查
sonar-pmd-plugin 阿里规范插件

3.开发工具集成手动扫描

这部分网上文章比较多,有命令方式,也有与开发工具集成模式,本文不再展开讲,我们将重点放在与Jenkins自动化部分。
3.1Java扫描
idea配置
安装SonarLint 插件
File->Settings->Plugins,搜索sonar,找到SonarLint 安装,安装完毕后重启idea。
重启后,按下图启用Sonarlint绑定Sonar环境

idea 启用sonar

然后点击SonarLint Project Settings绑定项目
pom.xml添加依赖包即可完成扫描

    
  org.sonarsource.scanner.maven    
  sonar-maven-plugin    
3.2

3.2.Net扫描
下载SonarQube Scanner for MSBuild,它是C# Framework的Sonar分析插件。
解压后,修改配置文件SonarQube.Analysis.xml中的URL、USER、PASSWORD配置。
运行:
扫描前CMD先进行项目代码所在目录,然后再执行下面的命令

步骤1准备:SonarScanner.MSBuild.exe begin /k:"ProjectKey" /n:"xxx.webApi" /v:"1.4"
步骤2编译:MSBuild.exe /t:Rebuild /p:Configuration=Release  
步骤3扫描:SonarScanner.MSBuild.exe end
projectKey:创建项目时第一步取的project Key
xxx.webApi: 这里填写你项目的名称
v:自定义一个版本号,方便后面追溯搜索记录
MSBuild所在目录
X86: C:\Program Files (x86)\MSBuild\版本.0\Bin\MSBuild.exe
X64: C:\Program Files (x86)\MSBuild\版本.0\Bin\amd64\MSBuild.exe

详细可参考:https://www.cnblogs.com/jinjiangongzuoshi/p/11648785.html
另外也可以直接安装Visual Studio插件实现可视化自动扫描,参考:https://www.cnblogs.com/jingridong/p/6593135.html

4.Jenkins集成Java自动扫描

Jenkins集成你可以在Jenkins安装sonarqube插件可视化配置再执行
但如果希望更灵活控制,建议采用脚本模式执行。
以下脚本精简了核心部分,我们传入三个变量给Jenkins:

       "sonarUrl":"http://sonar.xxx.cn",
        "sonarKey":"springBoot01",
        "sonarToken":"a101303cf56d1959f6761637efb8f35fd6ab22e1"

编写Jenkins脚本

  stage('Sonar Analyze') {
            if (sonarUrl?.trim()) {
                println("#############################################开始代码质量检查##################################################")
                withEnv(["JAVA_HOME=/root/jenkins/tools/${jdkVersion}", "MVN_HOME=/root/jenkins/tools/maven3"]) {
                    def consoleLog = sh(script: '"$MVN_HOME/bin/mvn" sonar:sonar -Dsonar.projectKey="' + sonarKey + '" -Dsonar.host.url="' + sonarUrl + '" -Dsonar.login="' + sonarToken + '"', returnStdout: true)
                    println("#############################################代码质量检查完毕##################################################")
          }
    }
}

验证执行结果
Jenkins跑流水线返回如下

#############################################开始代码质量检查##################################################
[Pipeline] withEnv
[Pipeline] {
[Pipeline] sh
+ /root/jenkins/tools/maven3/bin/mvn sonar:sonar -Dsonar.projectKey=springBoot01 -Dsonar.host.url=http://sonar.xxxx.cn -Dsonar.login=a101303cf56d1959f6761637efb8f35fd6ab22e1
[Pipeline] echo
#############################################代码质量检查完毕##################################################
[Pipeline] echo

到Sonarqube看结果如下:

springBoot01项目扫描结果

5.Jenkins集成.net Core自动扫描

5.1安装扫描工具dotnet-sonarscanner
在线安装方式:
在.net sdk安装目录运行以下命令,安装扫描工具,目前最新为4.8.0
[root@k8s-master dotnetsdk3.1]# ./dotnet tool install --global dotnet-sonarscanner --version 4.8.0
注意4.7以前的版本无法兼容.netCore3.x
离线安装方式方式
先下载Nupkg
https://globalcdn.nuget.org/packages/dotnet-sonarscanner.4.8.0.nupkg
上传到当前目录,再执行下面的安装命令(注意下面命令最后一个.代表在当前目录找nupkg包)
dotnet tool install --global dotnet-sonarscanner --version 4.8.0 --add-source .
全局安装后,安装后的路径是:/root/.dotnet/tools
附卸载及查看tool安装命令
[root@k8s-master dotnetsdk3.1]# ./dotnet tool list
./dotnet tool uninstall dotnet-sonarscanner --global
5.2安装.net core sdk3.0
因为目前sonarscanner是默认使用的是.net core3.0版本的sdk,但并不影响我们使用3.1版本的程序代码,只是扫描时sonarscanner会找.net core3.0版本sdk运行,否则使用 dotnet-sonarscanner begin命令时会提示如下错误:
The specified framework 'Microsoft.NETCore.App', version '3.0.0' was not found.
因而我们需要安装一个3.0版本sdk,安装及配置过程如下:

wget --no-check-certificate -O dotnet-3.0.tar.gz https://download.visualstudio.microsoft.com/download/pr/43f3a3bd-3df2-41e6-beca-3ec4952ca6c4/30fe7779249607d1bb3bb4b20d61a479/dotnet-sdk-3.0.103-linux-x64.tar.gz
 mkdir /root/jenkins/tools/dotnetsdk3.0
tar zvxf dotnet-3.0.tar.gz -C /root/jenkins/tools/dotnetsdk3.0

安装后,我们需要将dotnet命令默认指向.net core sdk3.0目录

vim /etc/profile  #修改该文件,在后面添加两行
export DOTNET_ROOT=/root/jenkins/tools/dotnetsdk3.0
export PATH=$DOTNET_ROOT:$PATH
wq保存后,执行下面命令刷新profile使修改生效
[root@k8s-master netCore01]# source /etc/profile
[root@k8s-master ~]# dotnet --version
3.0.103

此外,如果linux下没有安装jdk,则需要提前安装下,并将Java_HOME按上面的方式配置到profile中,如:

export JAVA_HOME=/root/jenkins/tools/openjdk11
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

Jenkins脚本编写
以下是核心代码,在git拉取代码完成并build后执行这个环节即可。

我们传入三个变量给Jenkins:
        "sonarUrl":"http://sonar.xxx.cn",
        "sonarKey":"netCore01",
        "sonarToken":"21013031156d1959f6761637efb8f35fd6ab22e1"
    stage('Sonar Analyze') {
      if (sonarUrl?.trim()) {
       def consoleLog= sh(script: '/root/.dotnet/tools/dotnet-sonarscanner begin /k:"'+sonarKey '" /d:sonar.host.url="'+sonarUrl '" /d:sonar.login="'+sonarToken+ '" /d:sonar.language="cs"',returnStdout: true )
       sh(script: '/root/jenkins/tools/${sdkVersion}/dotnet build')
       sh(script: '/root/.dotnet/tools/dotnet-sonarscanner end    /d:sonar.login="${sonarToken}"')
       println("#############################################代码质量检查完毕##################################################")               
      }
    }

验证执行结果
Jenkins执行过程,部分输出删除

[Pipeline] { (Sonar Analyze)
[Pipeline] withEnv
[Pipeline] {
[Pipeline] sh
+ /root/.dotnet/tools/dotnet-sonarscanner begin /k:netCore01 /d:sonar.host.url=http://sonar.xxxx.cn /d:sonar.login=21013031156d1959f6761637efb8f35fd6ab22e1/d:sonar.language=cs
[Pipeline] sh
+ /root/jenkins/tools/dotnetsdk3.1/dotnet build
Microsoft (R) Build Engine version 16.4.0+e901037fe for .NET Core
Copyright (C) Microsoft Corporation. All rights reserved.

  Restore completed in 32.59 ms for /root/jenkins/workspace/netCore01/netCore01.csproj.
Startup.cs(43,13): warning S125: Remove this commented out code. 
  netCore07 -> /root/jenkins/workspace/netCore01/bin/Debug/netcoreapp3.1/netCore01.dll
  Sonar: (netCore07.csproj) Project processed successfully

Build succeeded.

Startup.cs(43,13): warning S125: Remove this commented out code. 
    6 Warning(s)
    0 Error(s)

Time Elapsed 00:00:03.76
[Pipeline] sh
+ /root/.dotnet/tools/dotnet-sonarscanner end /d:sonar.login=21013031156d1959f6761637efb8f35fd6ab22e1
SonarScanner for MSBuild 4.8
Using the .NET Core version of the Scanner for MSBuild
Post-processing started.
Calling the SonarQube Scanner...
INFO: Scanner configuration file: /root/.dotnet/tools/.store/dotnet-sonarscanner/4.8.0/dotnet-sonarscanner/4.8.0/tools/netcoreapp3.0/any/sonar-scanner-4.2.0.1873/conf/sonar-scanner.properties
...略
NFO: Analysis total time: 4.995 s
INFO: ------------------------------------------------------------------------
INFO: EXECUTION SUCCESS
INFO: ------------------------------------------------------------------------
INFO: Total time: 6.296s
INFO: Final Memory: 12M/44M
INFO: ------------------------------------------------------------------------
The SonarQube Scanner has finished
22:03:42.119  Post-processing succeeded.
[Pipeline] echo
#############################################代码质量检查完毕##################################################

Sonarqube项目界面查看扫描结果

netCore01项目扫描结果

6.结语

sonarqube是一个优秀的扫描工具,并且提供了丰富的扩展能力,通过编写插件可以自定义扫描规则,通过对规则集定义可以制定适合自己团队的扫描规范。通过API扩展还可以完成更加灵活的集成与对接;
本篇我们完成了sonarqube的安装及java/.net使用,并且尝试了java/.net的自动化集成,下篇我们将通过其API定义完成对sonar的数据及结果的集成,实现更高级的功能。
如果想了解sonar的基本功能及界面操作使用,建议自行搜索资料并多尝试,本系列不再讲解这些基础功能。

你可能感兴趣的:(代码质量检查Sonarqube安装及Jenkins自动化集成)