SonarQube 代码审查

Posted by Vito on December 10, 2023

准备一台新虚拟机

安装 PostgreSQL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# https://www.postgresql.org/download/linux/redhat/
# Install the repository RPM:
[zc@Sonar ~]$ sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm

# Disable the built-in PostgreSQL module:
[zc@Sonar ~]$ sudo dnf -qy module disable postgresql

# Install PostgreSQL:
[zc@Sonar ~]$ sudo dnf install -y postgresql16-server

# Optionally initialize the database and enable automatic start:
[zc@Sonar ~]$ sudo /usr/pgsql-16/bin/postgresql-16-setup initdb
[zc@Sonar ~]$ sudo systemctl enable postgresql-16
[zc@Sonar ~]$ sudo systemctl start postgresql-16

# 修改 listen_addresses 和 port
# listen_addresses : 指定服务器在哪些 TCP/IP 地址上监听客户端连接。值的形式是一个逗号分隔的主机名或数字 IP 地址列表。特殊项*对应所有可用 IP 接口。
[zc@Sonar ~]$ sudo vim /var/lib/pgsql/16/data/postgresql.conf
listen_addresses = '*'
port = 5432

# 修改远程连接权限
[zc@Sonar ~]$ sudo vim /var/lib/pgsql/16/data/pg_hba.conf
host    all             all             192.168.3.1/24          trust
host    all             all             192.168.23.1/24         trust

# 重启 pgsql 
[zc@Sonar ~]$ sudo systemctl restart postgresql-16

# Postgresql 安装成功后会自动创建 postgresql 用户,无密码
# 切换到 postgresql 用户
[root@Sonar ~]# su - postgres
# 连接到 pgsql ,然后修改 pgsql 超管 postgres 的密码
[postgres@Sonar ~]$ psql -p 5432 -U postgres
psql (16.1)
输入 "help" 来获取帮助信息.

postgres=# ALTER USER postgres WITH PASSWORD 'postgres'
postgres-# \q
[postgres@Sonar ~]$ 

# 防火墙
[zc@Sonar ~]$ sudo firewall-cmd --add-port=5432/tcp --permanent
[zc@Sonar ~]$ sudo firewall-cmd --reload

在 PostgreSQL 中为 SonarQube 创建用户和数据库

1
2
3
4
5
6
7
8
[postgres@Sonar ~]$ psql -p 5432 -U postgres
psql (16.1)
输入 "help" 来获取帮助信息.

postgres=# CREATE USER sonar WITH PASSWORD 'sonar';
CREATE ROLE
postgres=# CREATE DATABASE sonar WITH ENCODING = 'UTF8' OWNER sonar;
CREATE DATABASE
  • If you want to use a custom schema and not the default “public” one, the PostgreSQL search_path property must be set:
    • ALTER USER mySonarUser SET search_path to mySonarQubeSchema

安装 Java

1
2
3
4
5
6
7
8
9
10
[zc@Sonar ~]$ mkdir software
[zc@Sonar ~]$ cd software
[zc@Sonar software]$ wget https://cdn.azul.com/zulu/bin/zulu17.46.19-ca-jdk17.0.9-linux_x64.tar.gz
[zc@Sonar software]$ sudo tar -zxf zulu17.46.19-ca-jdk17.0.9-linux_x64.tar.gz -C /usr/local/
[zc@Sonar software]$ sudo ln -s /usr/local/zulu17.46.19-ca-jdk17.0.9-linux_x64 /usr/local/java
[zc@Sonar software]$ sudo vim /etc/profile
JAVA_HOME=/usr/local/java
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME PATH
[zc@Sonar software]$ source /etc/profile

安装 SonarQube 社区版

  • 下载 https://www.sonarsource.com/products/sonarqube/downloads/
  • 解压
    1
    2
    3
    4
    5
    
    [zc@Sonar software]$ sudo yum install -y zip unzip
    [zc@Sonar software]$ unzip sonarqube-9.9.3.79811.zip
      
    [zc@Sonar software]$ sudo mkdir /usr/local/sonarqube
    [zc@Sonar software]$ sudo mv sonarqube-9.9.3.79811/* /usr/local/sonarqube/
    
  • sonarqube 不能用 root 启动,新建用户来管理 sonarqube
    1
    2
    3
    
    [zc@Sonar software]$ sudo useradd sonar
    [zc@Sonar software]$ sudo passwd sonar
    [zc@Sonar software]$ sudo chown -R sonar:sonar /usr/local/sonarqube
    
  • 编辑 sonarqube 配置文件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    [zc@Sonar software]$ sudo vim /usr/local/sonarqube/conf/sonar.properties
    # The schema must be created first.
    sonar.jdbc.username=sonar
    sonar.jdbc.password=sonar
    #----- PostgreSQL 11 or greater
    # By default the schema named "public" is used. It can be overridden with the parameter "currentSchema".
    sonar.jdbc.url=jdbc:postgresql://192.168.23.15:5432/sonar?currentSchema=public
    # TCP port for incoming HTTP connections. Default value is 9000.
    sonar.web.port=9000
    
  • 防火墙
    1
    2
    
    [zc@Sonar ~]$ sudo firewall-cmd --add-port=9000/tcp --permanent
    [zc@Sonar ~]$ sudo firewall-cmd --reload
    
  • 设置系统参数,否则 sonarqube 依赖的 elasticsearch 会启动失败
    1
    2
    3
    
    [zc@Sonar ~]$ sudo vim /etc/sysctl.conf
    vm.max_map_count = 655360
    [zc@Sonar ~]$ sudo sysctl -p
    
  • 启动
    1
    2
    3
    4
    5
    6
    
    [zc@Sonar software]$ su - sonar
    [sonar@Sonar ~]$ sudo ln -s /usr/local/sonarqube/bin/linux-x86-64/sonar.sh /usr/bin/sonar
    [sonar@Sonar ~]$ sonar start
    /usr/local/java/bin/java
    Starting SonarQube...
    Started SonarQube.
    
  • 访问 http://192.168.23.15:9000/ admin/admin ,初次登陆后需修改密码
  • 开机启动
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    [root@Sonar ~]# vim /usr/lib/systemd/system/rc-local.service
    [Install]
    WantedBy=multi-user.target
      
    [root@Sonar ~]# systemctl enable rc-local
    Created symlink /etc/systemd/system/multi-user.target.wants/rc-local.service → /usr/lib/systemd/system/rc-local.service.
       
    [root@Sonar ~]# ll /etc/rc.local 
    lrwxrwxrwx. 1 root root 13  9月 27 16:19 /etc/rc.local -> rc.d/rc.local
    [root@Sonar ~]# ll /etc/rc.d/rc.local
    -rw-r--r--. 1 root root 474  9月 27 16:19 /etc/rc.d/rc.local
    [root@Sonar ~]# chmod u+x /etc/rc.d/rc.local
      
    [root@Sonar ~]# vim /etc/rc.local
    # 以指定的用户身份执行命令
    su - sonar -c "/usr/local/sonarqube/bin/linux-x86-64/sonar.sh start"
    
  • 安装中文插件
  • 创建 token
    • token 创建后需要马上复制保存,系统中不会再次显示该 token 的值
    • 本例创建的 token 的值是 sqa_b3d44ba9d1d50b81942312c20c16651de24b72bd

Jenkins 集成 SonarQube

  • jenkins 安装 SonarQube Scanner 插件
  • 添加 SonarQube 凭证
  • 在 Jenkins 中配置 SonarQube

  • SonaQube 关闭审查结果上传到 SCM 功能

    • SCM 功能可以自动分配问题,不建议关闭
    • 需要在 sonarqube 中添加用户,且用户名与 git 或 svn 上的一样
    • 如果是 svn 则还需额外在 sonarqube 中填写一个能够访问 svn 的账号信息
  • 在 jenkins 项目中添加 SonaQube 代码审查(非流水线项目)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    # must be unique in a given SonarQube instance
    sonar.projectKey=test-sonar-freestyle
    # this is the name and version displayed in the SonarQube UI. Was mandatory prior to SonarQube 6.1.
    sonar.projectName=test-sonar-freestyle
    sonar.projectVersion=1.0
    # Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows.
    # This property is optional if sonar.modules is set.
    sonar.sources=.
    sonar.exclusions=**/test/**,**/target/**
    sonar.java.source=17
    sonar.java.target=17
    # Encoding of the source code. Default is default system encoding
    sonar.sourceEncoding=UTF-8
    
  • 在 jenkins 项目中添加 SonarQube 代码审查(流水线项目)
    • 在项目的根目录下创建 sonar-project.properties 文件(文件名是固定的)
    • 修改 pipeline 脚本,加入 SonarQube 代码审查阶段

IDEA 整合 SonarQube

  • idea 安装 SonarLint 插件

Maven 整合 SonarQube

  • 在 maven 的 settings.xml 配置文件中添加如下设置
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    <profile>
      <id>sonar-9.9</id>
      <activation>
        <activeByDefault>false</activeByDefault>
      </activation>
      <properties>
        <sonar.login>sqa_b3d44ba9d1d50b81942312c20c16651de24b72bd</sonar.login>
        <sonar.host.url>http://192.168.23.15:9000</sonar.host.url>
        <sonar.language>java</sonar.language>
      </properties>
    </profile>
    
  • 执行如下 maven 指令进行项目代码审查
    • mvn sonar:sonar -P sonar-9.9

补充:SonarQube webhook

添加 webhook

  • 上图添加的是全局 webhook
  • 也可以在项目配置中添加项目级别的 webhook

jenkins 等待 webhook 结果,然后判定流程是否继续

1
2
3
4
5
6
7
8
9
10
11
12
13
14
stage('Check') {
    script {
        scannerHome = tool 'sonarqube-scanner-5.0.1'
    }
    dir("${contextPath}") {
        withSonarQubeEnv('sonarqube-9.9') {
            sh "${scannerHome}/bin/sonar-scanner"
        }
    }
    timeout(time: 3, unit: 'MINUTES') {
        // waitForQualityGate : 等待 SonarQube 分析完成并返回质量状态
        waitForQualityGate abortPipeline: true
    }
}