干货教程:看这里,全网最详细的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

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线