架构

  1. 一台SonarQube Server启动3个主要过程:
    • Web服务器,供开发人员,管理人员浏览高质量的快照并配置SonarQube实例
    • 基于Elasticsearch的Search Server从UI进行后退搜索
    • Compute Engine服务器,负责处理代码分析报告并将其保存在SonarQube数据库中
  2. 一个SonarQube数据库要存储:
    • SonarQube实例的配置(安全性,插件设置等)
    • 项目,视图等的质量快照。
  3. 服务器上安装了多个SonarQube插件,可能包括语言,SCM,集成,身份验证和管理插件
  4. 在构建/持续集成服务器上运行一个或多个SonarScanner,以分析项目

Sonar组成

img

Sonar集成过程

img

版本

image-20240825205818739

jdk版本:jdk-1.8.0_linux-x64_bin.tar.gz(注:sonarqube从7.9起,不再支持jdk11以下版本)

数据库:mysql5.6-5.7(sonarqube从7.8起,不再支持mysql)(功能验证也可以SonarQube内置的数据库,这样就不需要改数据库配置)

安装部署

准备工作

  • 运行SonarQube的唯一前提条件是在计算机上安装Java(Oracle JRE 11或OpenJDK 11)
  • 实例至少需要2GB的RAM才能有效运行,而OS则需要1GB的可用RAM。
  • 每个节点分配50Gb的驱动器空间
  • 安装在具有出色读写性能的硬盘驱动器上(“数据”文件夹中包含Elasticsearch索引,当服务器启动并运行时,将在该索引上进行大量的i/o。)
  • SonarQube在服务器端不支持32位系统。但是,SonarQube确实在扫描仪侧支持32位系统

平台支持

image-20240825210303618

Install for Linux

  • 添加系统用户
useradd sonarqube
passwd sonarqube
  • 优化系统参数
# 设置最大虚拟内存区域数量
sysctl -w vm.max_map_count=262144

# 设置系统可以同时打开的最大文件描述符数量
sysctl -w fs.file-max=65536

# 设置当前会话中每个进程可以打开的最大文件描述符数量
ulimit -n 65536

# 设置每个用户可以创建的最大进程数
ulimit -u 4096
  • 解压安装包
unzip xxx-xx.zip  -d /usr/local
ln -sv /usr/local/xxx-xx  /usr/local/sonarqube
chown -R sonarqube:sonarqube /usr/local/sonarqube
  • 更改配置文件
vim /usr/local/sonarqube/conf/sonar.properties
sonar.jdbc.username=sonarqube
sonar.jdbc.password=
sonar.jdbc.url=jdbc:postgresql://127.0.0.1/sonarqube
  • 安装postgresql
yum install https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-7-x86_64/pgdg-centos96-9.6-3.noarch.rpm
yum install postgresql96-server postgresql96-contrib

# 初始化数据库
/usr/pgsql-9.6/bin/postgresql96-setup initdb

# 启动服务,并开机自启
systemctl enable postgresql-9.6  --now

# 切换到 postgres 用户并执行所有数据库操作
sudo -i -u postgres bash <<EOF
psql -U postgres -c "ALTER USER postgres WITH ENCRYPTED PASSWORD 'new_password';"
psql -U postgres -c "CREATE USER sonarqube WITH PASSWORD 'xxxxx';"
psql -U postgres -c "CREATE DATABASE sonarqube OWNER sonarqube;"
psql -U postgres -c "GRANT ALL ON DATABASE sonarqube TO sonarqube;"
psql -U sonarqube -d sonarqube -c "CREATE SCHEMA my_schema;"
EOF

#开启远程访问
vi /var/lib/pgsql/9.6/data/postgresql.conf   # listen_addresses = '*' 
vi /var/lib/pgsql/9.6/data/pg_hba.conf     # host    all      all      0.0.0.0/0        md5
systemctl restart postgresql-9.6.service
  • 启动sonarqube

Install for Docker

## 创建数据目录
mkdir -p /data/devops/sonarqube/{sonarqube_conf,sonarqube_extensions,sonarqube_logs,sonarqube_data}
chmod 777 -R /data/devops6/sonarqube/

## 运行
docker run  -itd  --name sonarqube \
    -p 9000:9000 \
    -v /data/devops/sonarqube/sonarqube_conf:/opt/sonarqube/conf \
    -v /data/devops/sonarqube/sonarqube_extensions:/opt/sonarqube/extensions \
    -v /data/devops/sonarqube/sonarqube_logs:/opt/sonarqube/logs \
    -v /data/devops/sonarqube/sonarqube_data:/opt/sonarqube/data \
    sonarqube:7.9.2-community

访问: http://x.x.x.x:9000/ 默认密码是 admin admin

image-20240825211518069

配置管理

强制登录

image-20240825215020537

LDAP集成

image-20240825215103690

GitlibSOO集成

image-20240825215228073

image-20240825220501759

Github集成

image-20240826203239610

项目分析

安装配置sonarscanner

下载地址1:SonarScanner CLI (sonarsource.com)

下载地址2:SonarSource Downloads-CDN

image-20240826204238642

分析项目-本地

sonar-scanner \
    -Dsonar.host.url=http://192.168.1.200:9000 \  # SonarQube服务器地址
    -Dsonar.projectKey=demo-maven-service \       # 项目唯一标识
    -Dsonar.projectName=demo-maven-service \      # 项目名称
    -Dsonar.projectVersion=1.0 \                  # 项目版本
    -Dsonar.login=admin \                         # 登录用户名
    -Dsonar.password=admin \                      # 登录密码
    -Dsonar.ws.timeout=30 \                       # Web服务超时时间(秒)
    -Dsonar.projectDescription="my first project!" \ # 项目描述
    -Dsonar.links.homepage=http://www.baidu.com \ # 项目主页
    -Dsonar.sources=src \                         # 源代码目录
    -Dsonar.sourceEncoding=UTF-8 \                # 源代码编码
    -Dsonar.java.binaries=target/classes \        # 编译后的类文件目录
    -Dsonar.java.test.binaries=target/test-classes \ # 编译后的测试类文件目录
    -Dsonar.java.surefire.report=target/surefire-reports # Surefire测试报告目录

分析项目-Jenkins

JinkinsSonar插件

image-20240826220005876


image-20240826215904416


image-20240826215832376


  • jenkinslib/src/org/devops/sonarqube.groovy文件
package org.devops

//scan
def SonarScan(sonarServer,projectName,projectDesc,projectPath,branchName){    
    //定义服务器列表
    def servers = ["test":"sonarqube-test","prod":"sonarqube-prod"]    // jekinssonar插件有关
    
    withSonarQubeEnv("${servers[sonarServer]}"){         // jekinssonar插件有关
        def scannerHome = "/usr/local/sonar-scanner"
        //def sonarServer = "http://192.168.1.200:9000"
        def sonarDate = sh  returnStdout: true, script: 'date  +%Y%m%d%H%M%S'
        sonarDate = sonarDate - "\n"
    
        
        sh """
            ${scannerHome}/bin/sonar-scanner \
                -Dsonar.projectKey=${projectName} \
                -Dsonar.projectName=${projectName} \
                -Dsonar.projectVersion=${sonarDate} \
                -Dsonar.ws.timeout=30 \
                -Dsonar.projectDescription=${projectDesc} \
                -Dsonar.links.homepage=http://www.baidu.com \
                -Dsonar.sources=${projectPath} \
                -Dsonar.sourceEncoding=UTF-8 \
                -Dsonar.java.binaries=target/classes \
                -Dsonar.java.test.binaries=target/test-classes \
                -Dsonar.java.surefire.report=target/surefire-reports
                # -Dsonar.branch.name=${branchName} -X 
        """
    }
}
  • Jenkinsfiles/ci.jenkinsfile文件
def tools - new org.devops.tools()
def sonar = new org.devops.sonarqube()

//Pipline
pipline {
	agent {
		node {
			label "master"
		}
	}
	
	stages {
		stage("QA") {
			steps {
				script {
					tools.PrintMes(“代码扫描”,"green")
					sonar.SonarScan("${JOB_NAME}","${JOB_NAME}","src")
				}
			}
		}
	}
}

效果:

image-20240826214823110

项目管理