【DevOps实战系列】第九章:详解Sonarqube搭建及集成Jenkins环境

news2025/1/13 13:53:32

个人亲自录制全套DevOps系列实战教程手把手教你玩转DevOps全栈技术

在这里插入图片描述

质量安全审计:Sonarqube

Sonarqube(声呐)大家应该不陌生,通过扫描代码分析代码质量与代码安全,方便我们快速定位代码缺陷、潜在风险。

个人建议: 作为项目质量智能分析工具,他是个双刃剑,在公司规模足够大并且足够重视代码质量时,sonar会有一个不错的位置;当如果公司规模小型,并且公司不足以把重点放在代码质量上,那么sonar可能会成为拖后腿的工具,一句话就是是否有必要上sonar完全看公司的需求以及成本。

作用阶段: 我们讨论下sonar应该在什么阶段起作用

  • 代码开发阶段实时检测【sonarlint插件,为sonar 8.5版本后提供,需要集成到开发工具如Idea,配置时需要sonarqube服务支持,分析结果会提示在控制台,类似前端eslint作用】
  • 代码提交前进行sonar扫描【需集成到本地开发工具,如Idea或Eclipse】
  • 提交代码时进行sonar扫描【需集成到gitlab,如sonar-gitlab-plugin,也可结合Gitlab CI进行提交流程控制】
  • 构建代码时进行sonar扫描【需集成到jenkins,如SonarQube Scanner插件】
  • 由sonar定期自主扫描代码生成报告【可以用jenkins的定时job】

具体应该部署哪种方案,也需要大家根据自身情况适当选择,没有完美的方案,选择最适合自己的方案即可。

此处我们集成到jenkins做演示。其他方式大家有兴趣可以找我咨询。

Docker容器部署

官网:https://docs.sonarqube.org/latest/setup/install-server/

根据官方文档可知,sonar是支持docker部署的,并且非常简单,sonar默认使用H2数据库,我们也可以指定自己的mysql等数据库。

选用版本:8.9 该版本为LTS长期支持版本,从7.9版本开始sonar必须有jdk11支持并且不再支持Mysql数据库。sonar默认采用H2数据库。

官方推荐配置:SonarQube扫描器需要版本8或11的JVM,SonarQube服务器需要版本11和最少2G内存,具体大家可以官网看。

Sonar的社区版免费
在这里插入图片描述
Sonar包括3个组件: Scanner负责扫描代码并分析生成报告->报告交给Sonar服务进行计算->最终结果存入数据库。下边我们通过docker-compose方式启动sonar容器。

注意:sonar不能以root身份运行在基于Unix系统上,我们这里使用的是基于Debian内核,所以没问题。

# vi /docker/sonarqube/docker-compose.yml
# 此处我们使用默认的H2数据库,如果外接数据库,可参考官网docker-compose.yml文件
version: "3"
services:
  sonarqube:
    # 使用一下私服拉取
    image: 10.10.1.199:9083/sonarqube:8.9-community
    restart: always
    container_name: 'sonarqube'
    hostname: 'sonarqube'
    networks:
      - 'exist-net-bloom'
    volumes:
      # 配置文件
      - '/docker/sonarqube/conf:/opt/sonarqube/conf'
      # 保存H2数据和ES索引文件
      - '/docker/sonarqube/data:/opt/sonarqube/data'
      # 保存第三方插件
      - '/docker/sonarqube/extensions:/opt/sonarqube/extensions'
      # 日志
      - '/docker/sonarqube/logs:/opt/sonarqube/logs'
    ports:
      - "9097:9000"
networks:
  exist-net-bloom:
    external:
      name: devops
      
# 如果需要自行修改配置,比如使用其他数据库等,可以在conf目录增加sonar.properties配置文件,具体可到官方获取
# 官方下载地址:https://www.sonarqube.org/downloads/

访问:10.10.1.199:9097,注意以上docker-compose.yml并未指定上下文,默认为/,可以自行指定。

在这里插入图片描述
输入:admin,admin即可
在这里插入图片描述
不过下边有一个黄色警告,他的意思是嵌入式数据库应该只用于测试不能用于生产,那样不利于扩展,并且不支持升级到最新版本的sonarqube,我们这里用的默认H2所以会有提示,如果大家想尝试连接自己的数据,当然不能是Mysql,如果要用mysql可以使用7.9以下的版本,如果要使用单独数据库,通过docker-compose.yml指定几个环境变量就行了:

environment:
SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar
SONAR_JDBC_USERNAME: sonar
SONAR_JDBC_PASSWORD: sonar

中文插件安装:

在这里插入图片描述
结果安装失败了,点击按钮后,页面无反应
在这里插入图片描述
报错原因是到github上下载插件失败,超时了:docker logs -f sonarqube 可看到报错日志,那理所当然我们认为是网络问题,手动下载,地址如下:https://github.com/xuhuisheng/sonar-l10n-zh/releases/download/sonar-l10n-zh-plugin-8.9/sonar-l10n-zh-plugin-8.9.jar

诡异的事情:出于好奇,想到当前用的H2,会不会跟这个有关呢?于是我尝试了使用postgresql[结果出乎意料]

version: "3"
services:
sonarqube:
 # 使用一下私服拉取
 image: 10.10.1.199:9083/sonarqube:8.9-community
 restart: always
 container_name: 'sonarqube'
 hostname: 'sonarqube'
 networks:
      - 'exist-net-bloom'
    volumes:
      # 配置文件
      - '/docker/sonarqube/conf:/opt/sonarqube/conf'
      # 保存H2数据和ES索引文件
      - '/docker/sonarqube/data:/opt/sonarqube/data'
      # 保存第三方插件
      - '/docker/sonarqube/extensions:/opt/sonarqube/extensions'
      # 日志
      - '/docker/sonarqube/logs:/opt/sonarqube/logs'
    depends_on:
      - postgressql
    environment:
      # 避免ip变更,使用hostname连接
      SONAR_JDBC_URL: jdbc:postgresql://postgressql:5432/sonar
      SONAR_JDBC_USERNAME: sonar
      SONAR_JDBC_PASSWORD: sonar
    ports:
      - "9097:9000"

  postgressql:
    image: 10.10.1.199:9083/postgres:12
    restart: always
    container_name: 'postgressql'
    hostname: 'postgressql'
    environment:
      POSTGRES_USER: sonar
      POSTGRES_PASSWORD: sonar
    volumes:
      - '/docker/sonarqube/postgresql:/var/lib/postgresql'
      - '/docker/sonarqube/postgresql/data:/var/lib/postgresql/data'
    networks:
      - 'exist-net-bloom'
networks:
  exist-net-bloom:
    external:
      name: devops


# 删除原有容器
docker-compose down
# 重新启动容器
docker-compose up -d

启动sonar报错:

ERROR: [1] bootstrap checks failed. You must address the points described in the following [1] lines before starting Elasticsearch.
bootstrap check failure [1] of [1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
ERROR: Elasticsearch did not exit normally - check the logs at >/opt/sonarqube/logs/sonarqube.log

解决方法: 在宿主机的/etc/sysctl.conf中增加该配置即可,注意因为容器也是复用宿主的系统配置,所以直接改宿主机即可。

vi /etc/sysctl.conf  # 新增如下配置
vm.max_map_count=262144

# 更新启动容器
docker-compose up -d

在这里插入图片描述
出乎意料,安装成功了!!!

这。。。,就不是github网络问题吧?

推测:其实还有一个问题,就是下载插件后无法保存到插件目录,即无法保存到/opt/sonarqube/extensions/plugins,因为被映射到宿主机了,如果无权写数据也可能会超时,所以修改宿主机目录权限:chmod -R 777 /docker/sonarqube/extensions
在这里插入图片描述
那为什么H2数据库就不行,PostgreSQL就可以呢?

我查了下文档,并没有找到答案,可能这就是亲儿子效应吧,H2都不推荐你用你非要用,出问题了吧 。。。,还是乖乖用PostgreSQL才是王道啊!

Sonar客户端配置

由官网文档得知,客户端需要使用Scanner工具完成扫描和上报(sonar早期版本还单独提供有sonarqube runner工具,和scanner类似),并且Scanner有多重实现方式

官方地址:https://docs.sonarqube.org/8.9/analysis/overview/

在这里插入图片描述

我们这里演示两种方式:Maven和Jenkins

  • Springboot工程本地集成Scanner插件
  • Jenkins集成Scanner插件

Maven配置

既然是maven当然可以配置到全局settings.xml,也可以配置到springboot项目的pom.xml中。

注意:我们的sonar是需要登录的,所以事先我们先把token生成一下,直接使用用户名密码也可以,用token可以防止密码泄露
在这里插入图片描述
配置到settings.xml

<settings>
    <pluginGroups>
        <pluginGroup>org.sonarsource.scanner.maven</pluginGroup>
    </pluginGroups>
    <profiles>
        <profile>
            <id>sonar</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                # 指定token,如果使用用户名密码,需要增加<sonar.password>属性
                <sonar.login>0226e22e60902a670f8c706e12e5ceee86c51f9e</sonar.login>
                <sonar.host.url>http://10.10.1.199:9097</sonar.host.url>
            </properties>
        </profile>
     </profiles>
</settings>

配置到Springboot项目的pom.xml

<build>
  <pluginManagement>
    <plugins>
      <plugin>
        <groupId>org.sonarsource.scanner.maven</groupId>
        <artifactId>sonar-maven-plugin</artifactId>
        <version>3.7.0.1746</version>
      </plugin>
    </plugins>
  </pluginManagement>
</build>
<profiles>
  <profile>
    <id>sonar</id>
    <activation>
      <activeByDefault>true</activeByDefault>
    </activation>
    <properties>
       <sonar.login>0226e22e60902a670f8c706e12e5ceee86c51f9e</sonar.login>
       <sonar.host.url>http://10.10.1.199:9097</sonar.host.url>
    </properties>
  </profile>
</profiles>

测试: 在工程根目录执行 mvn sonar:sonar
在这里插入图片描述
错误:你的工程包含java文件,请使用sonar.java.binaries属性指定class文件目录或使用sonar.exclusions属性排除java文件。

# 修正后执行命令,也可以在pom.xml中增加该属性
mvn sonar:sonar -Dsonar.java.binaries=target/

# 关于属性大家可以到官网查看:https://docs.sonarqube.org/8.9/analysis/analysis-parameters/

在这里插入图片描述

覆盖率:

这里延伸一下sonar覆盖率的概念,他会在scanner之前将汇总报告生成到target目录,然后由scanner一起上报给sonar服务。

覆盖率的概念是单元测试的覆盖面囊括了我们源代码的比例,更多的在测试中使用。

我们看图中覆盖率是0,其实覆盖率要生效需要使用另一个插件,对于java代码的统计汇总需要的是jacoco,其他语言大家也可参考官网:https://docs.sonarqube.org/8.9/analysis/coverage/

<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.6</version>
<configuration>
 <!--指定生成.exec文件的存放位置-->
 <destFile>target/coverage-reports/jacoco-unit.exec</destFile>
 <!--Jacoco是根据.exec文件生成最终的报告,所以需指定.exec的存放路径-->
 <dataFile>target/coverage-reports/jacoco-unit.exec</dataFile>
 <!-- 如果以上都不指定,默认jacoco-unit.exec会存入target/目录,report也会从target目录读取-->
 <!-- 并且report会将报告存入target/site/jacoco/index.html -->
</configuration>
<executions>
 <execution>
   <id>jacoco-prepare-agent</id>
   <goals>
     <goal>prepare-agent</goal>
   </goals>
 </execution>
 <execution>
   <id>jacoco-report</id>
   <!-- 指定生成报告的maven目标 -->
   <phase>verify</phase>
   <goals>
     <goal>report</goal>
   </goals>
 </execution>
</executions>
</plugin>


# 执行先生成覆盖率报告,在scanner扫描
mvn clean verify sonar:sonar

Jenkins改造

在这里我们主要演示让sonar集成到jenkins,这样jenkins不论是单独的定时任务job还是目前我们demo项目的job,都可以进行按需的分析代码。

我们还是以demo为例,目标:maven构建打包的同时进行sonar分析完成扫描代码并上报。

思考:jenkins需要修改吗?要怎么修改?有几种方案?不修改行吗?

  • 不修改: 当然行,因为demo工程的pom.xml已经配置了Sonar Scanner,可以通过mvn命令直接使用
    缺点:没有配置Scanner的其他job无法实现通过Scanner扫描上报
  • 修改方案1: 给jenkins中的maven配置文件settings.xml做全局配置
    缺点:由于settings.xml配置能力有限,有些特殊配置无法实现
  • 修改方案2: 与Maven集成Jenkins类似,将Sonarqube-Scanner的安装包装入容器,然后全局工具中配置,再安装对应的jenkins插件,这样在job中就可以单独去使用Scanner功能了,而不必依赖于job个体。
第一个方案很简单:

只需要将job的Maven构建脚本改成:-DskipTests=true clean package verify sonar:sonar

打包后进行Scanner扫描上报Sonar。
在这里插入图片描述

根据jenkins日志片段可知,Scanner已经生效了,并且将代码扫描后上传到了Sonar服务器,此时我们打开Sonar控制台也可以看到上报的demo工程。

我们可以修改下工程中代码并且提交gitlab,在用jenkins重新构建,可以发现sonar的新上报。

第三种方案:

Jenkins中彻底集成Scanner 【第二种也比较简单,大家自行验证下,我试了是没问题的

①首先下载Scanner安装包:
以下哪个地址能下用哪个,我下载的是:sonar-scanner-cli-4.7.0.2747-linux.zip

官方地址:https://docs.sonarqube.org/8.9/analysis/scan/sonarscanner/

二进制地址:https://binaries.sonarsource.com/?prefix=Distribution/sonar-scanner-cli/

注意需要使用:unzip解压,如果要构建到Dockerfile,则需先通过yum install -y unzip,我这里直接贴出来Dockerfile文件

这里我们就不把他构建到Dockerfile了,而是直接解压到jenkins根目录,根目录已经映射出来,所以操作也很方便

包括jdk、git、maven如果大家觉得没必要打入镜像,都可以这样操作。

②将安装包解压到/docker/jenkins/home目录

# apt install unzip 我用的omv是基于Debian
yum install -y unzip 
# 解压
unzip sonar-scanner-cli-4.7.0.2747-linux.zip
# 改下文件夹名字
mv sonar-scanner-4.7.0.2747-linux sonar-scanner


③Jenkins中安装sonar插件:【SonarQube Scanner For Jenkins】
在这里插入图片描述
配置sonar路径:系统管理 -> 系统配置 -> SonarQube servers
在这里插入图片描述
④全局配置工具:设置sonar-scanner环境目录
在这里插入图片描述
⑤修改job配置:在maven构建之后增加sonar scanner,即放在推送镜像到私服环节之前
在这里插入图片描述
添加后我们什么都不配运行看下效果:
在这里插入图片描述
依次尝试后,我们把必要参数全部配置好:
在这里插入图片描述
再看sonarqube控制台,已经发布上来了。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/94276.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

希尔贝壳邀您参加 ISCSLP 2022 Program

第十三届中文口语语言处理国际会议将于2022年12月11-14日&#xff08;本周日~下周三&#xff09;正式开启&#xff0c;本次会议中的部分Session将通过语音之家视频号进行线上直播&#xff0c;欢迎大家参加&#xff01; 官网&#xff1a;www.iscslp2022.org 大会简介 中文口语…

别再秃头背锅了,这个小技巧统计第三方接口耗时很安逸

前言 之前我有写过一篇记录生产环境事故的文章&#xff0c;获得了不少好评。 后续&#xff0c;我们团队有做过一些讨论&#xff0c;为了支撑运营维护&#xff0c;搭建了更好的日志平台 GranfaLoki&#xff0c;也引入了 SkyWalking 做链路追踪。 但过程中也遇到了一些问题&#…

30多个Flatsome主题优秀电商网站案例

想知道您可以使用 WordPress Flatsome WooCommerce主题&#xff08;最畅销的电子商务主题之一&#xff09;制作什么样的网站吗&#xff1f; 我们已经浏览了使用这个非常受欢迎的电商主题尽可能多的案例&#xff08;近1000个&#xff09;&#xff0c;并汇总了30个Flatsome主题优…

windows安装es、kibana教程

目录 前言 第一个部分&#xff1a;安装ES的包 1.安装成功的截图 2.下载es的安装包 3.检查本地的jdk的安装是否存在问题 4.修改config文件夹下面的配置 第二部分&#xff1a;windows 安装Kibana可视化工具 1.下载安装包 2.安装过程中遇到的问题 3.安装6.0.0的版本是可以…

【Android】BlueTooth开发记录

Ble开发中,存在着两个角色&#xff1a;中心设备角色和外围设备角色。 外围设备&#xff1a;一般指非常小或者低功耗设备,更强大的中心设备可以连接外围设备为中心设备提供数据。外设会不停的向外广播&#xff0c;让中心设备知道它的存在。 例如小米手环。中心设备&#xff1a;可…

学习周报-20221216

文章目录一 centos6和centos7系统的服务启动与关闭二 Linux下的/etc/pam.d/system-auth配置文件参数各列参数说明1&#xff09;第一列2&#xff09;第二列3&#xff09;第三列和第四列常用类说明三 Linux用户密码过期策略一 相关文件二 修改密码三 设置密码过期策略四 Linux中使…

将渲染计算搬到云端,开启低成本、强交互、沉浸式体验

云渲染可以解放本地计算需求&#xff0c;这意味着生产力的大幅提升。 云渲染的基本原理是将3D渲染应用部署到云端&#xff0c;接收本地的控制指令发送到云端&#xff0c;云端启动游戏引擎并进行画面渲染&#xff0c;编码成视频流传输到本地。 不难看出&#xff0c;云渲染技术的…

3节点Fate集群实战记录(全网最详细)--横向联邦学习

集群配置 集群的三台服务器分别部署了fate-10000, fate-9999, fate-9998命名空间&#xff0c;集群的具体部署情况请转&#xff1a;link查看。 文章后面以命名空间名来区分操作所在的节点&#xff08;注意节点的实际名字不等于命名空间名&#xff09;。集群的配置信息如下&…

【嵌入式开源库:cJSON】 一个轻量级C语言JSON数据解析库用法详解

cJSON简介 cJSON是使用C语言编写&#xff0c;用来创建、解析JSON文件的库。cJSON特点就是工程文件简单&#xff0c;只有一个.c和一个.h&#xff0c;但提供函数接口功能齐全&#xff0c;麻雀虽小五脏俱全&#xff0c;使得在嵌入式工程中使用起来得心应手。 cJSON获取 https:/…

小程序本地 存储/获取值以及删除本地的值

场景&#xff1a;小程序本地存储的方法 wx.setStorageSync&#xff1a;直接给定key和value值 wx.setStorage&#xff1a;需指定key及value&#xff0c;然后再指定相应的值 小程序获取本地值的方法 wx.getStorageSync&#xff1a;直接指定key值获取到对应的数据 wx.getStorage&a…

Node.js模块系统的实现机制简析

目录nodejs模块系统简介C版native模块的定义和加载加载过程JavaScript接口层万能的binding机制JavaScript版native模块的定义和加载js2c技术NativeModule的工作原理Node启动时构造NativeModule对象&#xff0c;完成name到source的映射懒加载机制总结nodejs模块系统简介 Node.j…

[附源码]Nodejs计算机毕业设计基于的校园商城Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

Linux系统编程2——进程介绍

文章目录前言一、程序和进程二、并行和并发三、进程控制块PCB进程状态四、创建进程相关函数1、fork函数fork函数总结2、getpid/getppid3、exec函数族3.1、execl函数3.2、execlp函数3.3、exec函数族原理介绍五、进程回收1、为什么要进行进程资源回收2、孤儿进程3、僵尸进程4、进…

传奇GEE引擎版本架设

传奇GEE引擎版本架设 我是艾西今天给大家分享下传奇GEE引擎版本的架设教程 &#xff08;仅做参考&#xff0c;以下内容为显示素材打码部分请读者理解遵守平台GZ&#xff09; 传奇GEE引擎版本我们架设游戏需要用到的工具&#xff1a; 版本&#xff08;游戏类型服务端&#xf…

[附源码]Node.js计算机毕业设计高校学生管理系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

[附源码]Node.js计算机毕业设计公司疫情健康信息管理系统appExpress

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

冰刃(IceSword)的使用方法(基础篇)

冰刃是一款功能强大的杀毒辅助软件&#xff0c;深受很多杀毒高手的青睐&#xff0c;这里我介绍一下冰刃这个软件的简单使用方法&#xff0c;供大家参考。说句实话&#xff0c;我不是高手&#xff0c;不能像高手一样把一些软件运用自如&#xff0c;所以这个方法可能有很多纰漏或…

怎么去视频的水印?两分钟让你学会操作

从事视频剪辑的小伙伴&#xff0c;想必都需要先从网上查找一些视频片段&#xff0c;再将其整合成一个视频&#xff0c;但是保存下来过后&#xff0c;再打开这些视频时&#xff0c;大家应该都会发现这些视频上都带有水印&#xff0c;很影响视频的观感度&#xff0c;从而可能会降…

Redis宝典

文章目录一.概念1.1 什么是redis1.2 redis优点二.redis的存储结构2.1 结构2.2 渐进式rehash三.Redis数据类型及应用场景3.1 字符串&#xff08;string&#xff09;3.2 字符串列表&#xff08;list&#xff09;3.3 字符串集合&#xff08;set&#xff09;3.4 有序字符串集合&…

找旅馆问题

一 问题描述 有 N 家旅馆&#xff0c;每家旅馆都有位置和价格&#xff0c;有 M 个客人希望找到一家价格可接受的最近旅馆。 二 输入和输出 1 输入 每个测试用例的第 1 行都包含两个整数 N&#xff08;N ≤200000&#xff09;和 M&#xff08;M ≤20000&#xff09;&#xf…