美文网首页
代码质量检查Sonarqube安装及Jenkins自动化集成

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

作者: 上岸的魚 | 来源:发表于2020-04-24 22:19 被阅读0次

    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添加依赖包即可完成扫描
    <plugin>    
      <groupId>org.sonarsource.scanner.maven</groupId>    
      <artifactId>sonar-maven-plugin</artifactId>    
    <version>3.2</version>
    

    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自动化集成

          本文链接:https://www.haomeiwen.com/subject/rrzmihtx.html