在Rocky Linux 9上安装Sonarqude

参考资料如下

本文写作时,Sonarqude最新版本为10.4.1.88267,系统为Rocky Linux 9 64bit,CPU架构为AMD64。

更新日志

时间 内容
2024年4月13日 v1.0 硬件要求,配置环境,安装Sonarqube服务器

一、硬件要求

根据官方文档硬件要求所述:

  1. SonarQube 服务器的小规模(个人或小团队)实例需要至少 2GB RAM 才能高效运行,并需要 1GB 可用 RAM 用于操作系统。如果您要为大型团队或企业安装实例,请考虑以下其他建议。
  2. 您需要的磁盘空间量取决于您使用 SonarQube 分析的代码量。
  3. SonarQube 必须安装在具有出色读写性能的硬盘上。 最重要的是,“data”文件夹包含 Elasticsearch 索引,当服务器启动并运行时,将在该索引上完成大量 I/O。 因此,硬盘的读写性能将对SonarQube服务器的整体性能产生很大影响。
  4. SonarQube 和 SonarScanner 仅支持 64 位系统。

二、配置环境

1. 更新软件包

1
sudo dnf update -y

如果更新速度慢,可以通过下列命令切换到国内中科大镜像源

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# Rocky Linux 8
sudo sed -e 's|^mirrorlist=|#mirrorlist=|g' \
    -e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.ustc.edu.cn/rocky|g' \
    -i.bak \
    /etc/yum.repos.d/Rocky-AppStream.repo \
    /etc/yum.repos.d/Rocky-BaseOS.repo \
    /etc/yum.repos.d/Rocky-Extras.repo \
    /etc/yum.repos.d/Rocky-PowerTools.repo
    
# Rocky Linux 9
sudo sed -e 's|^mirrorlist=|#mirrorlist=|g' \
    -e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.ustc.edu.cn/rocky|g' \
    -i.bak \
    /etc/yum.repos.d/rocky-extras.repo \
    /etc/yum.repos.d/rocky.repo

以上命令只替换了默认启用的仓库。替换之后请运行 dnf makecache 更新缓存。

2. 创建并切换到sonar用户

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 创建用户
sudo useradd -s /bin/bash -d /opt/sonar -m sonar

# 授予管理员权限
echo "sonar ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/sonar

# 修改密码(可选)
sudo passwd sonar
> Changing password for user sonar.
> New password:
> Retype new password:

# 切换用户
sudo -i -u sonar

3. 下载JAVA 17

由于可以通过指定环境变量SONAR_JAVA_PATH手动指定Java可执行文件,我们不在系统环境变量中配置Java,只要在用户文件夹中保留一份Java可执行文件的副本就行。

根据官方文档先决条件和概述所述,如下表,SonarQube 10.4服务器需要 Java 17。可以从Oracle官网下载。

Java Server Scanners
Oracle JRE check17 check17
OpenJDK check17 check17
1
2
3
4
5
6
7
# 下载Java可执行文件并解压
wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz
tar -zxvf jdk-17_linux-x64_bin.tar.gz

# 配置环境变量
echo "export SONAR_JAVA_PATH=\"/opt/sonar/jdk-17.0.10/bin/java\"" >> ~/.bashrc
source ~/.bashrc
  1. 理论上,仅安装JRE就可以满足存在Java可执行文件的需求。
  2. 也可以通过包管理器安装JDK或者JRE。
  3. 结合以上两点,可以通过命令sudo dnf install java-17-openjdk -y安装JRE 17

4. 安装PostgreSQL数据库

根据官方文档先决条件和概述所述,Sonarqude支持的数据库如下表。

PostgreSQL check15
check14
check13
check12
check11
Checkmark icon必须配置为使用 UTF-8 字符集
Microsoft SQL Server check2022 (MSSQL 16.0) with bundled Microsoft JDBC driver. Express Edition is supported.
check2019 (MSSQL Server 15.0) with bundled Microsoft JDBC driver. Express Edition is supported.
check2017 (MSSQL Server 14.0) with bundled Microsoft JDBC driver. Express Edition is supported.
check2016 (MSSQL Server 13.0) with bundled Microsoft JDBC driver. Express Edition is supported.
check2014 (MSSQL Server 12.0) with bundled Microsoft JDBC driver. Express Edition is supported.
Checkmark icon排序规则必须区分大小写 (CS) 和区分重音 (AS) (例如: Latin1_General_CS_AS).
Checkmark icon必须在 SonarQube 数据库上设置READ_COMMITTED_SNAPSHOT,以避免在重负载下出现潜在的死锁。
info支持 Windows 身份验证(“集成安全性”)和 SQL Server 身份验证。有关配置身份验证的说明,请参阅安装数据库中的 Microsoft SQL Server 部分。
Oracle check21C
check19C
checkXE Editions
exclamation必须配置为使用 UTF8 系列字符集(请参见NLS_CHARACTERSET)。
Checkmark icon不支持驱动程序ojdbc14.jar
info我们建议使用最新的 Oracle JDBC 驱动程序。
Checkmark icon仅支持精简模式,不支持 OCI。
Checkmark icon仅支持 MAX_STRING_SIZE=STANDARD 参数,不支持 EXTENDED

这里选择使用postgresql 15数据库,采用本地安装,安装教程可以参考PostgreSQL 下载。这里参考官方教程,采用阿里云源加速安装。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 安装存储库RPM
sudo dnf install -y https://mirrors.aliyun.com/postgresql/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# 替换下载链接
sudo sed -i "s@https://download.postgresql.org/pub@https://mirrors.aliyun.com/postgresql@g" /etc/yum.repos.d/pgdg-redhat-all.repo

# 禁用内置的PostgreSQL模块
sudo dnf -qy module disable postgresql

# 安装PostgreSQL
sudo dnf install -y postgresql15-server

# 初始化数据库并启用自动启动
sudo /usr/pgsql-15/bin/postgresql-15-setup initdb
sudo systemctl enable postgresql-15
sudo systemctl start postgresql-15

下面创建Sonarqude需要的数据库和用户

1
2
3
# 切换到postgres用户以登录postgresql数据库
sudo -i -u postgres
psql

此时进入postgres控制台,输入行头部为postgres=#

 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
# 创建sonar用户,xxxxxxx为自定义密码
CREATE USER sonar WITH ENCRYPTED PASSWORD 'xxxxxxx'; # eg. PcPak6vCmLvNYpC9

# 创建sonar数据库
CREATE DATABASE sonar;

# 赋予指定账户指定数据库所有权限
GRANT ALL PRIVILEGES ON DATABASE sonar TO sonar;

# 修改 sonar 数据库所属者为 sonar
ALTER DATABASE sonar OWNER TO sonar;

# 查看库和用户名
\l sonar

#输出
                                           List of databases
 Name  | Owner | Encoding |   Collate   |    Ctype    | ICU Locale | Locale Provider | Access privileges 
-------+-------+----------+-------------+-------------+------------+-----------------+-------------------
 sonar | sonar | UTF8     | en_US.UTF-8 | en_US.UTF-8 |            | libc            | =Tc/sonar        +
       |       |          |             |             |            |                 | sonar=CTc/sonar
       
\du sonar

# 输出
           List of roles
 Role name | Attributes | Member of 
-----------+------------+-----------
 sonar     |            | {}
 
 # 退出数据库
 \q

# 注销postgres用户
logout

# 重启数据库
sudo systemctl restart postgresql-15

5. 修改系统限制

根据平台备注-Linux所述,如果您在 Linux 上运行,则ll必须确保:

  • vm.max_map_count大于或等于524288
  • fs.file-max大于或等于131072
  • 运行 SonarQube 的用户可以打开至少 131072 个文件描述符
  • 运行SonarQube的用户可以打开至少8192个线程

可以使用以下命令查看这些值:

1
2
3
4
sysctl vm.max_map_count
sysctl fs.file-max
ulimit -n
ulimit -u

您可以通过运行以下命令为当前会话临时设置它们(需要root身份或sudo):

1
2
3
4
sysctl -w vm.max_map_count=524288
sysctl -w fs.file-max=131072
ulimit -n 131072
ulimit -u 8192

要更永久地设置这些值,您必须创建/etc/sysctl.d/99-sonarqube.conf (或者修改/etc/sysctl.conf)来修改这些值。

1
echo "vm.max_map_count = 524288" > /etc/sysctl.d/99-sonarqube.conf

如果运行 SonarQube 的用户 (在此示例中为sonar)没有权限打开至少 131072 个描述符,您必须以下内容插入/etc/security/limits.d/99-sonarqube.conf(或者/etc/security/limits.conf):

1
2
sonar   -   nofile   131072
sonar   -   nproc    8192

6. seccomp过滤器

默认情况下,Elasticsearch使用seccomp筛选。确保您使用的内核启用了seccomp。

检查一下 seccomp在您的内核上可用,请使用:

1
grep SECCOMP /boot/config-$(uname -r)

如果你的内核有 seccomp,将看到以下内容:

1
2
3
CONFIG_HAVE_ARCH_SECCOMP_FILTER=y
CONFIG_SECCOMP_FILTER=y
CONFIG_SECCOMP=y

三、安装Sonarqube服务器

1. 简介

SonarQube 实例包含三个组件:

SQ-instance-components

  1. SonarQube 服务器运行以下进程:

    • 为 SonarQube 用户界面提供服务的 Web 服务器。

    • 基于Elasticsearch的搜索服务器。

    • 计算引擎负责处理代码分析报告并将其保存在 SonarQube 数据库中。

  2. 数据库存储以下内容:

    • 代码扫描期间生成的代码质量和安全性指标和问题。
    • SonarQube 实例配置。
  3. 在构建或持续集成服务器上运行的一台或多台扫描仪来分析项目。

2. 从 ZIP 文件安装 SonarQube 服务器

下载并解压发行版。(不要解压到以数字开头的目录中)。 由于有大佬制作了破解补丁,我们可以去体验一下企业版本。各个版本区别如下:

image-20240413021201801

1
2
3
4
# 下载企业版并解压
wget https://binaries.sonarsource.com/CommercialDistribution/sonarqube-enterprise/sonarqube-enterprise-10.4.1.88267.zip -O sonarqube-enterprise.zip
unzip sonarqube-enterprise.zip
mv sonarqube-10.4.1.88267 sonarqube

SonarQube 在基于 Unix 的系统上无法以 root 运行。

<sonarqubeHome>(下面所示)指的是 SonarQube 发行版解压目录的路径,在本案例中为/opt/sonar/sonarqube

破解补丁

上传SonarQubeAgent-1.2-SNAPSHOT.jar /opt/sonar/sonarqube,该文件可在SonarQube 破解下载。

使用编辑器(VIM,NANO)打开/opt/sonar/sonarqube/conf/sonar.properties,修改如下内容

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#sonar.web.javaOpts=-Xmx1G -Xms128m -XX:+HeapDumpOnOutOfMemoryError

# -javaagent:/opt/sonar/Applications/sonarqube-10.4.1.88267/SonarQubeAgent-1.2-SNAPSHOT.jar

# 修改为,注意去掉开头的#号
sonar.web.javaOpts=-javaagent:/opt/sonar/sonarqube/SonarQubeAgent-1.2-SNAPSHOT.jar -Xmx1G -Xms128m -XX:+HeapDumpOnOutOfMemoryError

#sonar.ce.javaOpts=-Xmx2G -Xms128m -XX:+HeapDumpOnOutOfMemoryError

# 修改为,注意去掉开头的#号
	
sonar.ce.javaOpts=-javaagent:/opt/sonar/sonarqube/SonarQubeAgent-1.2-SNAPSHOT.jar -Xmx2G -Xms128m -XX:+HeapDumpOnOutOfMemoryError

设置对数据库的访问

使用编辑器(VIM,NANO)打开/opt/sonar/sonarqube/conf/sonar.properties,修改如下内容

1
2
3
sonar.jdbc.username=sonar
sonar.jdbc.password=<安装数据库那一步给sonar用户创建的密码>
sonar.jdbc.url=jdbc:postgresql://localhost/sonar

sonar.sh添加到环境变量

使用编辑器(VIM,NANO)打开/opt/sonar/.bashrc,在文件底部如下内容,然后执行source /opt/sonar/.bashrc

1
2
SONAR_HOME="/opt/sonar/sonarqube"
export PATH=${SONAR_HOME}/bin/linux-x86-64:${PATH}

3. 启动网络服务器

执行sonar.sh start,通过访问 http://<ip>:9000 打开网页控制台。默认用户名密码都为admin,登录后按如下步骤找到激活码输入框。

image-20240413025845049

填入如下的激活码,勾上输入框下面的复选框,然后点击``Save`。

1
Q29tcGFueT1Vbmtub3duCkRpZ2VzdD1Ob3RSZXF1aXJlZApFZGl0aW9uPUVudGVycHJpc2UKRWRpdGlvbkxhYmVsPUVudGVycHJpc2UKRXhwaXJhdGlvbj0yMDk5LTAxLTAxCk1heExvYz05MjIzMzcyMDM2ODU0Nzc1ODA2ClBsdWdpbnM9YWJhcCxjcHAscGxzcWwsc2VjdXJpdHksc29uYXJhcGV4LHN3aWZ0LHRzcWwsdmJuZXQsY29ib2wscGxpLHJwZyx2YgpGZWF0dXJlcz0qClNlcnZlcklkPSoKU3VwcG9ydD1mYWxzZQpUeXBlPW55MGM=

4. 安装汉化包

注意,除了社区版(Community Edition)可以直接在Administration > Marketplace安装插件以外,其他版本只能在Marketplace中浏览插件,必须手动安装和更新插件。

手动安装插件:

  1. 下载您要安装的插件。 该版本需要与您的 SonarQube 版本兼容。
  2. 将下载好的jar包放入 <sonarqubeHome>/extensions/plugins,并删除相同插件的任何先前版本。
  3. 重新启动您的 SonarQube 服务器。

汉化包下载地址为:https://github.com/SonarCommunity/sonar-l10n-zh,在本案例中,插件目录为/opt/sonar/sonarqube/extensions/plugins/

1
2
3
4
5
# 下载汉化插件
wget https://github.com/xuhuisheng/sonar-l10n-zh/releases/download/sonar-l10n-zh-plugin-10.5/sonar-l10n-zh-plugin-10.5.jar -O /opt/sonar/sonarqube/extensions/plugins/sonar-l10n-zh-plugin-10.5.jar

# 重启sonarqube
sonar.sh restart
Licensed under CC BY-NC-SA 4.0