Sonarqube 和 Sonar-scanner的安装和配置

news2024/9/17 4:31:06

SonarQube 简介

所谓sonarqube 就是代码质量扫描工具。
官网:
https://www.sonarsource.com/sonarqube/

在个人开发学习中用处不大, 我草, 我的代码质量这么高需要这玩意?

但是在公司项目中, 这个可是必须的, 你永远都不知道你的队友写了什么进git 仓库



SonarScanner 简介

至于SanarScanner 就是1个本地工具, 用于把你的代码push 到SonarQube server 用于分析
参考:
https://docs.sonarsource.com/sonarqube/latest/analyzing-source-code/scanners/sonarscanner/



搭建本地 SonarQube 方案

由于SonarQube 企业版是收费的, GCP上也没有SonarQube 的托管服务。
所以建议还是自己基于SonarQube 社区版搭建1个服务



准备1个有docker 环境的linux server

这个例子是1个WSL2 server

gateman@DESKTOP-UIU9RFJ:~$ neofetch
            .-/+oossssoo+/-.               gateman@DESKTOP-UIU9RFJ 
        `:+ssssssssssssssssss+:`           ----------------------- 
      -+ssssssssssssssssssyyssss+-         OS: Ubuntu 20.04.2 LTS on Windows 10 x86_64 
    .ossssssssssssssssssdMMMNysssso.       Kernel: 5.10.16.3-microsoft-standard-WSL2 
   /ssssssssssshdmmNNmmyNMMMMhssssss/      Uptime: 24 days, 11 hours, 47 mins 
  +ssssssssshmydMMMMMMMNddddyssssssss+     Packages: 807 (dpkg) 
 /sssssssshNMMMyhhyyyyhmNMMMNhssssssss/    Shell: bash 5.0.17 
.ssssssssdMMMNhsssssssssshNMMMdssssssss.   Terminal: /dev/pts/3 
+sssshhhyNMMNyssssssssssssyNMMMysssssss+   CPU: Intel i5-7260U (4) @ 2.207GHz 
ossyNMMMNyMMhsssssssssssssshmmmhssssssso   Memory: 5290MiB / 12689MiB 
ossyNMMMNyMMhsssssssssssssshmmmhssssssso
+sssshhhyNMMNyssssssssssssyNMMMysssssss+                           
.ssssssssdMMMNhsssssssssshNMMMdssssssss.                           
 /sssssssshNMMMyhhyyyyhdNMMMNhssssssss/
  +sssssssssdmydMMMMMMMMddddyssssssss+
   /ssssssssssshdmNNNNmyNMMMMhssssss/
    .ossssssssssssssssssdMMMNysssso.
      -+sssssssssssssssssyyyssss+-
        `:+ssssssssssssssssss+:`
            .-/+oossssoo+/-.

gateman@DESKTOP-UIU9RFJ:~$ docker --version
Docker version 24.0.5, build 24.0.5-0ubuntu1~20.04.1



准备1个Dockerfile

FROM sonarqube:10.6-community

ENTRYPOINT ["/opt/sonarqube/docker/entrypoint.sh"]

其实就是基于官网(docker-hub) 镜像构建1个



构建镜像

git pull && docker build -t gateman/sonarqube:1.0.0 .



运行镜像

docker run -p 9000:9000 gateman/sonarqube:1.0.0

把端口9000暴露出来就行



登陆

打开主机的页面
http://10.0.1.223:9000
在这里插入图片描述

第一次输入 admin:admin 就好, 然后马上会让你修改admin 帐号的密码



创建另1个用户

admin 帐号用于配置, 通常我们需要另1个账户分析代码

在这里插入图片描述


生成sonar token

切换到刚才创建账户登陆
生成1个Global Analysis Token 专门用于代码上传
在这里插入图片描述



安装SonarScanner

好了, 到了这一步服务端基本已经配置好
接下来要安装本地安装CLI 上传代码工具 SonarScanne
下载地址:
https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-6.1.0.4477-linux-x64.zip?_gl=1xwtft4_gcl_auMTM3NDUxMzczNS4xNzI1NjgyMjI1_gaMTQzNzQ0MDQ1Ni4xNzI1NjgyMjI1_ga_9JZ0GZ5TC6*MTcyNTY4MjIyNC4xLjEuMTcyNTY5MTEzMy42MC4wLjA.



解压
gateman@MoreFine-S500:~/Downloads/sonar$ ls
sonar-scanner-cli-6.1.0.4477-linux-x64.zip
gateman@MoreFine-S500:~/Downloads/sonar$ unzip sonar-scanner-cli-6.1.0.4477-linux-x64.zip 

gateman@MoreFine-S500:~/devtools$ mv ~/Downloads/sonar/sonar-scanner-6.1.0.4477-linux-x64/ .



enable 执行文件
vi ~/.bashrc

...
# sonar-scanner
export PATH="/home/gateman/devtools/sonar-scanner-6.1.0.4477-linux-x64/bin:$PATH"
...



利用 SonarScanner 出发扫描

sonar-scanner -Dsonar.host.url=http://10.0.1.223:9000 -Dsonar.projectKey=my:python-common -Dsonar.sources=/home/gateman/projects/python/python_common -Dsonar.login=sqa_acba1803e527317f966735b2ae664fab8b77753f -Dsonar.exclusions=**/venv/**

具体的参数选项:

参数Desc
-Dsonar.projectKey=project_key指定项目在 SonarQube 中的唯一标识。
-Dsonar.projectName=project_name指定项目在 SonarQube 中显示的名称。
-Dsonar.sources=source_directory指定要分析的源代码目录。
-Dsonar.host.url=sonarqube_server_url指定 SonarQube 服务器的 URL 地址。
-Dsonar.login=authentication_token指定用于连接 SonarQube 服务器的认证令牌。
-Dsonar.language=language指定要分析的编程语言。
-Dsonar.sourceEncoding=utf-8指定源代码的编码格式。
-Dsonar.projectVersion=project_version指定项目的版本号。
-Dsonar.branch.name=branch_name指定分析的分支名称。
-Dsonar.exclusions=pattern指定要排除的文件或目录模式。

默认 SonarQube会自动判断你的代码语言
但是最好用 -Dsonar.exclusions 排除掉那些库的代码(例如 venv of Python)



查看report

这时需要等服务器处理几分钟, 就可以从UI 上查看代码分析报告了
在这里插入图片描述





搭建GCP SonarQube 方案

为什么要搭在云上呢

本地方案有几个痛点

  1. sonarqube 使用频率偏少
  2. sonarqube 扫描时很耗cpu 和内存资源
  3. 我大部分CICD 设在GCP上, 无法连接家庭内网的服务器



首先还是准备一台有docker 环境的云主机

gateman@MoreFine-S500:~$ gcloud compute instances list --filter="status=RUNNING"
WARNING: This command is using service account impersonation. All API calls will be executed as [terraform@jason-hsbc.iam.gserviceaccount.com].
NAME                         ZONE            MACHINE_TYPE    PREEMPTIBLE  INTERNAL_IP   EXTERNAL_IP  STATUS
tf-vpc0-subnet0-main-server  europe-west2-c  n2d-standard-4  true         192.168.0.35  34.39.2.90   RUNNING
tf-vpc0-subnet0-mysql0       europe-west2-c  e2-standard-2   true         192.168.0.42               RUNNING
tf-vpc0-subnet0-vm0          europe-west2-c  n2-highmem-4    true         192.168.0.51               RUNNING
       _,met$$$$$gg.          root@tf-vpc0-subnet0-vm0 
    ,g$$$$$$$$$$$$$$$P.       ------------------------ 
  ,g$$P"     """Y$$.".        OS: Debian GNU/Linux 11 (bullseye) x86_64 
 ,$$P'              `$$$.     Host: Google Compute Engine 
',$$P       ,ggs.     `$$b:   Kernel: 5.10.0-32-cloud-amd64 
`d$$'     ,$P"'   .    $$$    Uptime: 9 hours, 43 mins 
 $$P      d$'     ,    $$P    Packages: 505 (dpkg) 
 $$:      $$.   -    ,d$$'    Shell: bash 5.1.4 
 $$;      Y$b._   _,d$P'      CPU: Intel Xeon (4) @ 2.800GHz 
 Y$$.    `.`"Y$$$$P"'         Memory: 2979MiB / 32112MiB 
 `$$b      "-.__
  `Y$$                                                
   `Y$$.                                              
     `$$b.
       `Y$$b.
          `"Y$b._
              `"""



配置terraform 添加1个cloud build trigger

添加1个trigger

# referring https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/cloudbuild_trigger
resource "google_cloudbuild_trigger" "sonarqube-service-gce-trigger" {
  name = "sonarqube-service-gce-trigger" # could not contains underscore

  location = var.region_id

  # when use github then should use trigger_template
  github {
    name = "sonarqube-server"
    owner = "nvd11"
    push {
      branch = "main"
      invert_regex = false # means trigger on branch
    }
  }

  substitutions = {
    _VM_HOST = "tf-vpc0-subnet0-vm0"
    _APP_ENV = "prod"
  }

  filename = "cloudbuild-gce.yaml"
  # projects/jason-hsbc/serviceAccounts/terraform@jason-hsbc.iam.gserviceaccount.com
  service_account = data.google_service_account.cloudbuild_sa.id 
}



编写cloudbuild-gce.yaml 以部署sonarqube 到某台GCE (google compute engine)

cloudbuild-gce.yaml

steps:

# https://cloud.google.com/build/docs/configuring-builds/substitute-variable-values
- id: build docker image
  name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'europe-west2-docker.pkg.dev/$PROJECT_ID/my-docker-repo/${_APP_NAME}:${_APP_TAG}', '.']

- id: upload docker image to GAR
  name: 'gcr.io/cloud-builders/docker'
  args: [ 'push', 'europe-west2-docker.pkg.dev/$PROJECT_ID/my-docker-repo/${_APP_NAME}:${_APP_TAG}']


- id: check and start VM if not running
  name: 'gcr.io/cloud-builders/gcloud'
  entrypoint: bash
  args:
    - '-c'
    - |
      set -x
      VM_STATUS=$(gcloud compute instances describe ${_VM_HOST} --zone=europe-west2-c --format='value(status)' 2>/dev/null || true)
      if [ "$$VM_STATUS" != "RUNNING" ]; then
        echo "VM ${_VM_HOST} was not running. Starting now..."
        gcloud compute instances start ${_VM_HOST} --zone=europe-west2-c
      else
        echo "VM ${_VM_HOST} is already running."
      fi

# to prepare ssh private key file
- id: deploy image to GCE
  name: 'gcr.io/cloud-builders/gcloud'
  entrypoint: bash
  args:
    - '-c'
    - |
      whoami
      gcloud auth list
      set -x
      mkdir -p /root/.ssh
      gcloud secrets versions access latest --secret=gateman-private-ssh-key > /root/.ssh/id_rsa
      gcloud secrets versions access latest --secret=gateman-public-ssh-key > /root/.ssh/id_rsa.pub
      chmod 600 /root/.ssh/id_rsa
      chmod 600 /root/.ssh/id_rsa.pub
      gcloud compute ssh gateman@${_VM_HOST} --zone=europe-west2-c --quiet --ssh-key-file=/root/.ssh/id_rsa -- "whoami" 
      gcloud compute ssh gateman@${_VM_HOST} --zone=europe-west2-c --quiet --ssh-key-file=/root/.ssh/id_rsa -- "sudo docker container prune -f; sudo docker ps -a"  
      gcloud compute ssh gateman@${_VM_HOST} --zone=europe-west2-c --quiet --ssh-key-file=/root/.ssh/id_rsa -- "sudo docker stop ${_APP_NAME} && sudo docker rm ${_APP_NAME}" 
      gcloud compute ssh gateman@${_VM_HOST} --zone=europe-west2-c --quiet --ssh-key-file=/root/.ssh/id_rsa -- "sudo docker pull europe-west2-docker.pkg.dev/$PROJECT_ID/my-docker-repo/${_APP_NAME}:${_APP_TAG}"
      gcloud compute ssh gateman@${_VM_HOST} --zone=europe-west2-c --quiet --ssh-key-file=/root/.ssh/id_rsa -- "sudo docker run -d -p ${_PORT}:${_CONTAINER_PORT} -e APP_ENVIRONMENT=${_APP_ENV} --name ${_APP_NAME} europe-west2-docker.pkg.dev/$PROJECT_ID/my-docker-repo/${_APP_NAME}:${_APP_TAG}"
      echo ok

# https://stackoverflow.com/questions/68779751/error-publishing-source-code-from-cloud-build-to-a-bucket-using-triggers
logsBucket: gs://jason-hsbc_cloudbuild/logs/
options: # https://cloud.google.com/cloud-build/docs/build-config#options
  logging: GCS_ONLY # or CLOUD_LOGGING_ONLY https://cloud.google.com/cloud-build/docs/build-config#logging

# to define

substitutions:
  _APP_NAME: sonarqube-server
  _APP_TAG: latest
  _VM_HOST: "tf-vpc0-subnet0-vm0"
  _PORT: "9000"
  _CONTAINER_PORT: "9000"

检查cloudbuild job, 确保部署成功
在这里插入图片描述


在有外网ip的主机上设置nginx 代理

因为安装 sonarqube 的主机 tf-vpc0-subnet0-vm0 并没有外网ip, 家里并不能访问
所以我们需要在有外网ip的主机上设个nginx 代理, 代理到 tf-vpc0-subnet0-vm0:9000

暴力配置:

upstream sonarqube-server {
    server tf-vpc0-subnet0-vm0:9000;
}

server {
    listen 9000;
    server_name www.jp-gvms.cloud;

    location / {
        proxy_pass http://sonarqube-server;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

}

这时可以打开 sonarqube 页面了, 相信你们也可以
http://www.jp-gcp-vms.cloud:9000/
在这里插入图片描述



登陆,修改admin 密码, 创建用户, 生成token

接下来这几步上面已经介绍过, 不再重复



把token 放入google 的secret manager

在这里插入图片描述sqa_2b62011d73270438f1d37ae0cf6acff4d23ea990



为springboot cloud-order service 创建1个cloudbuild trigger 专门用于sonarqube 扫描

好了, 到了上面一步, 其实sonarqube server 配置已经做好

接下来就是使用

首先创建1个cloudbuild job for 需要扫描的service


resource "google_cloudbuild_trigger" "demo_cloud_order-sonarqube-trigger" {
  name = "demo-cloud-order-sonarqube-trigger" # could not contains underscore

  location = var.region_id

  # when use github then should use trigger_template
  github {
    name = "demo_cloud_order"
    owner = "nvd11"
    push {
      branch = ".*"
      # for all branch
       
      invert_regex = false # means trigger on branch
    }
  }

  filename = "cloudbuild-sonarqube.yaml"
  # projects/jason-hsbc/serviceAccounts/terraform@jason-hsbc.iam.gserviceaccount.com
  service_account = data.google_service_account.cloudbuild_sa.id 
}

为springboot cloud-order service 创建1个cloudbuild-sonarqube yaml 用于定义具体出发sonar 扫描步骤

steps:

  # to prepare ssh private key file
  # as the default user of sonarsource/sonar-scanner-cli is scanner-cli, it could not create any subfolder in /workspace
  # that's why we need to change the permission to 777
  - id: prepare ssh private key file
    name: 'ubuntu'
    entrypoint: bash
    args:
      - '-c'
      - |
        set -x
        pwd
        chmod -R 777 .

  - id: trigger sonarqube scanning
    name: 'sonarsource/sonar-scanner-cli'
    entrypoint: '/bin/sh'
    args:
      - '-c'
      - |
        set -x
        whoami
        pwd
        ls -l
        sonar-scanner -Dsonar.projectKey=my:${_APP_NAME}  -Dsonar.host.url=${_SONARQUBE_HOST} -Dsonar.token=$$SONAR_TOKEN -Dsonar.projectKey=my:${_APP_NAME} -Dsonar.sources=. -Dsonar.java.binaries=./test_scripts
    secretEnv:
      - 'SONAR_TOKEN'


logsBucket: gs://jason-hsbc_cloudbuild/logs/
options: # https://cloud.google.com/cloud-build/docs/build-config#options
  logging: GCS_ONLY # or CLOUD_LOGGING_ONLY https://cloud.google.com/cloud-build/docs/build-config#logging

# to define
availableSecrets:
  secretManager:
    - versionName: projects/$PROJECT_ID/secrets/sonarqube-token-gateman/versions/latest
      env: 'SONAR_TOKEN'

substitutions:
  _SONARQUBE_HOST: http://www.jp-gcp-vms.cloud:9000
  _APP_NAME: cloud-order

检查log
在这里插入图片描述

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

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

相关文章

【高校主办,EI稳定检索】2024年人机交互与虚拟现实国际会议(HCIVR 2024)

会议简介 2024年人机交互与虚拟现实国际会议(HCIVR 2024)定于2024年11月15-17日在中国杭州召开,会议由浙江工业大学主办。人机交互,虚拟现实技术的发展趋势主要体现在系统将越来越实际化,也越来越贴近人类的感知和需求…

心觉:第一性原理思考和共情能力,怎么用效果更好

Hi,我是心觉,与你一起玩转潜意识、脑波音乐和吸引力法则,轻松掌控自己的人生! 挑战每日一省写作163/1000天 我很佩服逻辑能力很强的人 也很佩服共情能力很强的人 他们都很厉害 我自己感觉逻辑能力更强一点,平时喜欢…

strlen函数模拟实现(嵌套函数调用)

目录 1.模拟实现strlen函数代码(嵌套函数) 2.代码解释 小心!VS2022不可直接接触,否则..!没有这个必要,方源一把抓住VS2022,顷刻 炼化! 1.模拟实现strlen函数代码(嵌套函数&#x…

从零开始写论文:如何借助ChatGPT生成完美摘要?

AIPaperGPT,论文写作神器~ https://www.aipapergpt.com/ 在写论文的过程中,摘要是一个非常重要的部分,它能够帮助读者快速理解论文的核心内容,决定是否进一步阅读全文。但是许多学生在写摘要的时候常常感到困惑,不知…

Oracle 19c数据库:Windows详细安装与配置指南

Oracle 19c的安装和配置是一个相对复杂但系统化的过程,本文演示如何在 Windows 系统下安装 Oracle数据库,安装足够的磁盘空间(一般需要5~6个G,所以选剩余空间大的盘)。以下是一个详细的步骤指南,包括准备工…

多线程 | CompletableFutureAPI简单介绍

文章目录 1. 案例Future方案CompletableFuture方案 2. CompletableFuture方法一览使用new方法supplyAsync方法runAsync方法为什么仍需要CompletableFuture其他API介绍whenCompletethenApplythenAcceptthenComposethenCombineallOf&anyOfsupplyAsync 3. 注意点4. 总结 本文从…

游戏厅计费系统电玩计时系统软件 佳易王计时定时语音提醒管理系统操作教程

一、前言 游戏厅计费系统电玩计时系统软件 佳易王计时定时语音提醒管理系统操作教程 1、佳易王电玩店ps5计时计费软件,可以设置定时语音提醒。 2、软件为免安装版,解压即可。 二、软件程序部分功能图文说明 1、在设置定时语音提醒的时候,只…

第49课 Scratch入门篇:骇客任务背景特效

骇客任务背景特效 故事背景: 骇客帝国特色背景在黑色中慢慢滚动着! 程序原理: 1 、 角色的设计技巧  2 、克隆体的应用及特效的使用 开始编程 1、使用 黑色的背景: ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/7d74c872f06b4d9fbc88aecee634b074.png#pic_c…

以太坊入门

1. 以太坊简介 Vitalik Buterin 在 2013 年 11 月提出了以太坊的概念,其关键思想是:开发一种图灵完备(Turing-Complete) 的语言,以允许开发用于区块链和去中心化应用的任意程序(智能合约)。该概念与比特比相…

驱动(RK3588S)第七课时:单节点设备树

目录 需求一、设备树的概念1、设备树的后缀名:2、设备树的语法格式3、设备树的属性(重要)4、设备树格式举例 二、设备树所用函数1、如何在内核层种获取设备树节点:2、从设备树上获取 gpio 口的属性3、获取节点上的属性只针对于字符…

【0324】Postgres内核 Shared Buffer Access Rules (共享缓冲区访问规则)说明

0. 章节内容 1. 共享磁盘缓冲区访问机制 (shared disk buffers) 共享磁盘缓冲区有两套独立的访问控制机制:引用计数(a/k/a pin 计数)和缓冲区内容锁。(实际上,还有第三级访问控制:在访问任何属于某个关系表的页面之前,必须持有该关系表的适当类型的锁。这里不讨论关系…

[Linux Kernel Block Layer第一篇] block layer架构设计

目录 1. single queue架构 2. multi-queue架构(blk-mq) 3. 问题 随着SSD快速存储设备的发展,内核社区越发发现,存储的性能瓶颈从硬件存储设备转移到了内核block layer,主要因为当时的内核block layer是single hw queue的架构&…

【C语言】插入排序、希尔排序——动图展示

目录 1. 插入排序1.1 基本概念1.2 实现思路1.3 代码部分 2. 希尔排序2.1 为什么会有希尔排序?2.2 基本概念2.3 实现思想1)单组排序2)多组排序 2.4 代码部分 3. 总结 1. 插入排序 1.1 基本概念 把待排序的记录逐个插入到一个已经排好序的有序…

PMP–一、二、三模–分类–14.敏捷–技巧–看板面板与燃尽图燃起图

文章目录 技巧一模14.敏捷--方法--看板(类似卡片)1、 [单选] 根据项目的特点,项目经理建议选择一种敏捷方法,该方法限制团队成员在任何给定时间执行的任务数。此方法还允许团队提高工作过程中问题和瓶颈的可见性。项目经理建议采用…

微软出品的一款管理多个远程桌面连接的工具

RDCMan(Remote Desktop Connection Manager)是微软官方出品的一款用于管理多个远程桌面连接的工具。它可以帮助用户集中管理和分类远程桌面,特别适用于需要同时管理大量服务器或在不同计算机间切换操作的场景。 RDCMan的主要功能包括&#x…

使用WebP解决网站加载速度问题,这些细节你需要了解

说到网页的图片格式,大家最常想到的可能是JPEG、PNG,毕竟这些老牌格式陪伴我们这么多年。然而,近几年,有一个格式悄悄崭露头角,那就是WebP。很多人可能听说过,但到底它好在哪?你的网站或者项目是不是也应该用WebP呢?别着急,今天咱们就来好好聊聊WebP这个图片格式的前世…

SOMEIP_ETS_095: SD_Check_subscribe_eventgroup_ttl_expired

测试目的: 验证DUT(Device Under Test)能够检测到测试器(Tester)的订阅已过期(ttl 3秒),并且在TTL过期后不响应测试器触发的事件。 描述 本测试用例旨在确保DUT能够识别测试器的…

Kettle使用命令pan/kitchen执行任务时传参问题

在用windows任务执行kettle的kjb或ktr文件时,可通过bat命令传递参数,测试了很久,特此记录一下。 一、pan\kitchen 参数说明 Options: /rep : Repository name /user : Repository username /pass : Repository password…

【射频通信电路基础第二讲】射频通信电路基础知识——射频接插件、金属导线的趋肤效应、射频传输线及其特性、衰减电路等

一、射频接插件 参考https://blog.csdn.net/weixin_43813325/article/details/112340937 1、BNC:阻抗一般为50/75Ω,频带宽 2、SMA/SMB:损耗小,价格高昂 SMA接口有两种形式,分别如下所示,常规SMA“外螺纹…

AT32F415的OTA升级

AT32F415的OTA升级 项目简介IAP实现原理AT32中的内置FLASH分配情况AT32中的实现过程跳转到APP的程序代码删除APP区域的FLASH空间代码写APP的bin数据到FLASH空间代码 项目简介 在物联网应用开发过程中,不可避免的会需要用到软件升级,一般情况下&#xff…