干货教程:看这里,全网最详细的Sonar代码扫描平台搭建教程
优采云 发布时间: 2022-09-28 06:11干货教程:看这里,全网最详细的Sonar代码扫描平台搭建教程
01
声纳安装
官网:
1.声纳配置文件
sonar是一款静态代码质量分析工具,支持Java、Python、PHP、JavaScript、CSS等超过25种语言,可以集成到IDE、Jenkins、Git等服务中。 ,方便随时查看代码质量分析报告。
sonar通过配置的代码分析规则,从可靠性、安全性、可维护性、覆盖率、重复率等方面对项目进行分析,风险等级从A到E分为5个等级;
同时sonar可以集成pmd、findbugs、checkstyle等插件,扩展使用其他规则检查代码质量。
2.声纳合成
一个声纳项目主要由以下四个部分组成:
SonarQube 服务器启动三个主要进程:
供开发人员、管理员浏览高质量快照和配置 SonarQube 实例的 Web 服务器
基于 Elasticsearch 的搜索服务器,用于从 UI 进行反向搜索
Compute Engine 服务器,负责处理代码分析报告并保存在 SonarQube 数据库中
要存储的 SonarQube 数据库:
SonarQube 实例的配置(安全、插件设置等)
项目、视图等的质量快照
服务器上安装了几个 SonarQube 插件,可能包括语言、SCM、集成、身份验证和管理插件。
在构建/持续集成服务器上运行一个或多个 SonarScanner 以分析项目。
3.声纳安装
1.jdk 下载
sonar7.9.6需要jdk11或以上,所以我们使用jdk11,下载后上传到服务器
2.安装 postgresql 数据库
yum install -y
yum install -y postgresql13-server
/usr/pgsql-13/bin/postgresql-13-setup initdb
systemctl 启用 postgresql-13
systemctl 启动 postgresql-13
创建数据库
#先切换到postgres用户
su - postgres
执行创建命令
psql
使用密码“sonarqube”创建用户 sonarqube;
创建数据库 sonarqube 所有者 sonarqube;
将数据库 sonarqube 上的所有内容授予 sonarqube;
\q
苏-
3.下载声纳社区版
,下载后上传服务器
解压声纳-9.0.0.45539.zip
进入sonar的conf目录,编辑wrapper.conf,配置java
配置数据库信息:
进入sonar conf目录,编辑sonar.properties,配置数据库
4.启动声纳
启动前先创建sonar用户组,root用户不能直接启动sonar
创建用户组:groupadd sonar
创建用户:useradd sonar -g sonar
修改声纳目录为声纳用户:chown -R sonar:sonar sonarqube-7.9.6.zip
切换用户声纳
苏-声纳
启动sonar,首先进入sonar的bin目录下的linux-x86-64目录
启动命令:./sonar.sh start
查看启动日志:tail -f …/…/logs/sonar.log
可能的问题:
针对以上问题做如下处理:
修改/etc/sysctl.conf文件,在文件末尾追加vm.max_map_count=262144
修改 /etc/security/limits.conf 文件并将其附加到文件末尾
浏览器访问:您的服务器 ip:9000
登录用户admin密码admin
5.声纳中文插件安装
重新启动声纳。
02
声纳扫码配置
1.扫描仪配置
下载扫描仪
此扫描器可用于java、js、python、php
配置环境变量
将bin目录所在的路径添加到环境变量PATH中
2.声纳项目配置(java)
创建一个项目
在声纳平台创建项目,点击右上角的+号
输入项目基本信息
创建令牌
点击继续,选择java等选项
提交代码进行分析
进入你的java项目代码所在目录,执行上一步复制的指令。下面的命令不抄我的,抄自己页面的,记住这个
mvn sonar:sonar -Dsonar.projectKey=testjava -Dsonar.host.url=:9000 -Dsonar.login=6d7e7673d49b6af7215ebb3e6a1b0b2979e456af
提交成功后,可以在声纳页面看到如下分析结果
idea插件安装
1.打开文件—>设置—>插件,进入插件界面,搜索sonarlint
2.设置声纳
在文件中搜索声纳—>设置,进入声纳设置界面
点击+号输入声纳服务地址
输入令牌
点击Finish完成界面如下
设置声纳项目
3.对idea的sonarlint扫描
3.声纳项目配置(python)
创建一个项目
在声纳平台创建项目,点击右上角的+号
输入项目基本信息
创建令牌
点击继续,选择语言等
提交代码进行分析
进入你的python项目代码所在目录,执行上一步复制的指令。下面的命令不抄我的,抄自己页面的,记住这个
sonar-scanner.bat -D"sonar.projectKey=testpython" -D"sonar.sources=." -D"sonar.host.url=:9000" -D"sonar.login=023a9d3f793bbdd4c6d13560d65d8af58a4d4999"
成功提交日志摘录如下:
信息:7 个文件没有 CPD 块
信息:计算 11 个文件的 CPD
信息:CPD 计算完成
INFO:分析报告在 139ms 内生成,dir size=116 KB
INFO:分析报告压缩为 355 毫秒,zip 大小=49 KB
INFO:分析报告在 42 毫秒内上传
INFO: ANALYSIS SUCCESSFUL,您可以浏览:9000/dashboard?id=testpython
INFO:请注意,服务器处理完提交的分析报告后,您将能够访问更新的仪表板
信息:有关报告处理的更多信息:9000/api/ce/task?id=AXqKTkkD4VBbIALCoOM9
INFO:分析总时间:23.357 s
信息:--------------------------------- ---------------------
信息:执行成功
信息:--------------------------------- ---------------------
INFO:总时间:24.997s
信息:最终内存:13M/54M
信息:--------------------------------- ---------------------
成功后在sonar项目中查看。当然这个项目问题不多,代码重复率高。
pycharm插件安装
1.打开文件—>设置—>插件,进入插件界面,搜索sonarlint
2.设置声纳
在文件中搜索声纳—>设置,进入声纳设置界面
点击+号,输入声纳服务地址
输入令牌
点击Finish完成添加界面
设置 sonarlint 的项目
pycharm 上的声纳扫描
最佳实践:湖仓一体电商项目(十六):业务实现之编写写入ODS层业务代码
文章目录
业务实现之编写写入ODS层业务代码
由于本业务涉及到MySQL业务数据和用户日志数据,两类数据是分别采集存储在不同的Kafka Topic中的,所以这里写入ODS层代码由两个代码组成。
一、代码编写
处理MySQL业务库binlog数据的代码复用第一个业务代码只需要在”ProduceKafkaDBDataToODS.scala”代码中写入存入Icebeg-ODS层表的代码即可,“ProduceKafkaDBDataToODS.scala”代码文件中加入代码如下:
<p>//向Iceberg ods 层 ODS_PRODUCT_CATEGORY 表插入数据
tblEnv.executeSql(
"""
|insert into hadoop_iceberg.icebergdb.ODS_PRODUCT_CATEGORY
|select
| data['id'] as id ,
| data['p_id'] as p_id,
| data['name'] as name,
| data['pic_url'] as pic_url,
| data['gmt_create'] as gmt_create
| from kafka_db_bussiness_tbl where `table` = 'pc_product_category'
""".stripMargin)
//向Iceberg ods 层 ODS_PRODUCT_INFO 表插入数据
tblEnv.executeSql(
"""
|insert into hadoop_iceberg.icebergdb.ODS_PRODUCT_INFO
|select
| data['product_id'] as product_id ,
| data['category_id'] as category_id,
| data['product_name'] as product_name,
| data['gmt_create'] as gmt_create
| from kafka_db_bussiness_tbl where `table` = 'pc_product'
""".stripMargin)
处理用户日志的代码需要自己编写,代码中的业务逻辑主要是读取存储用户浏览日志数据topic “KAFKA-USER-LOG-DATA”中的数据,通过Flink代码处理将不同类型用户日志处理成json类型数据,将该json结果后续除了存储在Iceberg-ODS层对应的表之外还要将数据存储在Kafka topic “KAFKA-ODS-TOPIC” 中方便后续的业务处理。具体代码参照“ProduceKafkaLogDataToODS.scala”,主要代码逻辑如下:
object ProduceKafkaLogDataToODS {
private val kafkaBrokers: String = ConfigUtil.KAFKA_BROKERS
private val kafkaOdsTopic: String = ConfigUtil.KAFKA_ODS_TOPIC
private val kafkaDwdBrowseLogTopic: String = ConfigUtil.KAFKA_DWD_BROWSELOG_TOPIC
def main(args: Array[String]): Unit = {
val env: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
val tblEnv: StreamTableEnvironment = StreamTableEnvironment.create(env)
env.enableCheckpointing(5000)
import org.apache.flink.streaming.api.scala._
/**
* 1.需要预先创建 Catalog
* 创建Catalog,创建表需要在Hive中提前创建好,不在代码中创建,因为在Flink中创建iceberg表不支持create table if not exists ...语法
*/
tblEnv.executeSql(
"""
|create catalog hadoop_iceberg with (
| 'type'='iceberg',
| 'catalog-type'='hadoop',
| 'warehouse'='hdfs://mycluster/lakehousedata'
|)
""".stripMargin)
/**
* {
* "logtype": "browselog",
* "data": {
* "browseProductCode": "eSHd1sFat9",
* "browseProductTpCode": "242",
* "userIp": "251.100.236.37",
* "obtainPoints": 32,
* "userId": "uid208600",
* "frontProductUrl": "https://f/dcjp/nVnE",
* "logTime": 1646980514321,
* "browseProductUrl": "https://kI/DXSNBeP/"
* }
* }
*/
/**
* 2.创建 Kafka Connector,连接消费Kafka中数据
* 注意:1).关键字要使用 " 飘"符号引起来 2).对于json对象使用 map < String,String>来接收
*/
tblEnv.executeSql(
"""
|create table kafka_log_data_tbl(
| logtype string,
| data map
|) with (
| 'connector' = 'kafka',
| 'topic' = 'KAFKA-USER-LOG-DATA',
| 'properties.bootstrap.servers'='node1:9092,node2:9092,node3:9092',
| 'scan.startup.mode'='earliest-offset', --也可以指定 earliest-offset 、latest-offset
| 'properties.group.id' = 'my-group-id',
| 'format' = 'json'
|)
""".stripMargin)
/**
* 3.将不同的业务库数据存入各自的Iceberg表
*/
tblEnv.executeSql(
"""
|insert into hadoop_iceberg.icebergdb.ODS_BROWSELOG
|select
| data['logTime'] as log_time ,
| data['userId'] as user_id,
| data['userIp'] as user_ip,
| data['frontProductUrl'] as front_product_url,
| data['browseProductUrl'] as browse_product_url,
| data['browseProductTpCode'] as browse_product_tpcode,
| data['browseProductCode'] as browse_product_code,
| data['obtainPoints'] as obtain_points
| from kafka_log_data_tbl where `logtype` = 'browselog'
""".stripMargin)
//4.将用户所有日志数据组装成Json数据存入 kafka topic ODS-TOPIC 中
//读取 Kafka 中的数据,将维度数据另外存储到 Kafka 中
val kafkaLogTbl: Table = tblEnv.sqlQuery("select logtype,data from kafka_log_data_tbl")
//将 kafkaLogTbl Table 转换成 DataStream 数据
val userLogDS: DataStream[Row] = tblEnv.toAppendStream[Row](kafkaLogTbl)
//将 userLogDS 数据转换成JSON 数据写出到 kafka topic ODS-TOPIC
val odsSinkDS: DataStream[String] = userLogDS.map(row => {
//最后返回给Kafka 日志数据的json对象
val returnJsonObj = new JSONObject()
val logType: String = row.getField(0).toString
val data: String = row.getField(1).toString
val nObject = new JSONObject()
val arr: Array[String] = data.stripPrefix("{").stripSuffix("}").split(",")
for (elem