本节介绍单节点 SonarQube 实例。 有关集群设置的详细信息,请参阅将服务器安装为集群。
SonarQube 实例包含三个组件:
为了获得最佳性能,SonarQube 服务器和数据库应该安装在不同的主机上,并且服务器主机应该是专用的。 服务器和数据库主机应位于同一网络中。
所有主机都必须是时间同步的。
支持多个数据库引擎。 请务必遵循为您的数据库列出的要求。 它们是真正的要求而不是建议。
创建一个空架构和一个 sonarqube 用户。 授予此 sonarqube 用户权限以创建、更新和删除此架构的对象。
Microsoft SQL Server
排序规则必须区分大小写 (CS) 和区分重音 (AS)。
READ_COMMITED_SNAPSHOT 必须在 SonarQube 数据库上设置。
MS SQL 数据库的共享锁策略可能会影响 SonarQube 运行时。 确保 is_read_committed_snapshot_on 设置为 true 以防止 SonarQube 在重负载下面临潜在的死锁。
检查 is_read_committed_snapshot_on 的查询示例:
SELECT is_read_committed_snapshot_on FROM sys.databases WHERE name='YourSonarQubeDatabase';
更新 is_read_committed_snapshot_on 的查询示例:
ALTER DATABASE YourSonarQubeDatabase SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE;
要使用集成安全性:
如果您从命令提示符运行 SonarQube 服务器,则运行命令提示符的用户应具有 db_owner 数据库角色成员资格。
sonar.jdbc.url=jdbc:sqlserver://localhost;databaseName=sonar;integratedSecurity=true
要使用 SQL 身份验证,请使用以下连接字符串。 还要确保 sonar.jdbc.username 和 sonar.jdbc.password 设置正确:
sonar.jdbc.url=jdbc:sqlserver://localhost;databaseName=sonar
sonar.jdbc.username=sonarqube
sonar.jdbc.password=mypassword
Oracle
如果在同一个 Oracle 实例上有两个 SonarQube 模式,特别是如果它们用于两个不同的版本,SonarQube 会感到困惑并选择它找到的第一个。 为了避免这个问题:
Oracle JDBC 驱动程序版本 12.1.0.1 和 12.1.0.2 存在重大错误,不建议与 SonarQube 一起使用(查看更多详细信息)。
PostgreSQL
如果您想使用自定义架构而不是默认的“公共”架构,则必须设置 PostgreSQL search_path 属性:
ALTER USER mySonarUser SET search_path to mySonarQubeSchema
首先,检查要求。 然后下载并解压缩发行版(不要解压缩到以数字开头的目录)。
SonarQube 不能在基于 Unix 的系统上以 root 身份运行,因此如有必要,请为 SonarQube 创建一个专用用户帐户。
$SONARQUBE-HOME(如下)指的是 SonarQube 发行版解压后的目录路径。
编辑 $SONARQUBE-HOME/conf/sonar.properties 以配置数据库设置。 模板可用于每个受支持的数据库。 只需取消注释并配置您需要的模板并注释掉专用于 H2 的行:
Example for PostgreSQL
sonar.jdbc.username=sonarqube
sonar.jdbc.password=mypassword
sonar.jdbc.url=jdbc:postgresql://localhost/sonarqube
已提供支持的数据库(Oracle 除外)的驱动程序。 不要更换提供的驱动程序; 他们是唯一支持的。
对于 Oracle,将 JDBC 驱动程序复制到 $SONARQUBE-HOME/extensions/jdbc-driver/oracle。
默认情况下,Elasticsearch 数据存储在 $SONARQUBE-HOME/data 中,但不建议将其用于生产实例。 相反,您应该将此数据存储在其他地方,最好是在具有快速 I/O 的专用卷中。 除了保持可接受的性能外,这样做还可以简化 SonarQube 的升级。
编辑 $SONARQUBE-HOME/conf/sonar.properties 以配置以下设置:
sonar.path.data=/var/sonarqube/data
sonar.path.temp=/var/sonarqube/temp
用于启动 SonarQube 的用户必须对这些目录具有读写权限。
默认端口为“9000”,上下文路径为“/”。 这些值可以在 $SONARQUBE-HOME/conf/sonar.properties 中更改:
sonar.web.host=192.168.0.1
sonar.web.port=80
sonar.web.context=/sonarqube
执行以下脚本来启动服务器:
如果您的服务器上安装了多个 Java 版本,您可能需要明确定义所使用的 Java 版本。
要更改 SonarQube 使用的 Java JVM,请编辑 $SONARQUBE-HOME/conf/wrapper.conf 并更新以下行:
wrapper.java.command=/path/to/my/jdk/bin/java
请按照以下步骤进行首次安装:
使用以下命令创建卷:
$> docker volume create --name sonarqube_data
$> docker volume create --name sonarqube_logs
$> docker volume create --name sonarqube_extensions
确保您使用的是上述命令所示的卷,而不是绑定挂载。 使用绑定安装会阻止插件正确填充。
a. 使用嵌入式 H2 数据库启动 SonarQube 容器:
$ docker run --rm \
-p 9000:9000 \
-v sonarqube_extensions:/opt/sonarqube/extensions \
b. 一旦 SonarQube 正常启动就退出。
c. 将 Oracle JDBC 驱动程序复制到 sonarqube_extensions/jdbc-driver/oracle。
3. 使用 -e 环境变量标志定义的数据库属性运行映像:
$> docker run -d --name sonarqube \
-p 9000:9000 \
-e SONAR_JDBC_URL=... \
-e SONAR_JDBC_USERNAME=... \
-e SONAR_JDBC_PASSWORD=... \
-v sonarqube_data:/opt/sonarqube/data \
-v sonarqube_extensions:/opt/sonarqube/extensions \
-v sonarqube_logs:/opt/sonarqube/logs \
有关更多配置环境变量,请参阅 Docker 环境变量。
环境变量 SONARQUBE_JDBC_USERNAME、SONARQUBE_JDBC_PASSWORD 和 SONARQUBE_JDBC_URL 的使用已被弃用,并将在未来版本中停止使用。
如果您使用 Docker Compose,请在配置 .yml 文件时使用以下示例作为参考。 单击下面的标题以展开 .yml 文件。
下面的示例将使用最新版本的 SonarQube Docker 映像。 如果要使用 SonarQube 的 LTS 版本,您需要使用 sonarqube:lts-community 图像标签更新示例。
安装并运行服务器后,您可能还需要安装插件。 然后您就可以开始分析源代码了。
仔细检查 $SONARQUBE_HOME/conf/sonar.properties 中的代理设置是否正确设置。 请注意,如果您的代理用户名包含反斜杠,则应将其转义 - 例如文件中的用户名“域\用户”应如下所示:
http.proxyUser=domain\\user
对于某些代理,异常“java.net.ProtocolException: Server redirected too many times”可能意味着配置了不正确的用户名或密码。
SonarQube 启动一个 Elasticsearch 进程,并且运行 SonarQube 本身的帐户将用于 Elasticsearch 进程。 由于 Elasticsearch 不能以 root 身份运行,这意味着 SonarQube 也不能。 您必须选择其他非 root 帐户来运行 SonarQube,最好是专用于此目的的帐户。
在向 DevOps 平台报告 Quality Gate 状态时,SonarQube 使用 30 秒的 DNS 缓存生存时间策略。 如有必要,您可以在 JVM 中更改此设置:
echo "networkaddress.cache.ttl=5" >> "${JAVA_HOME}/conf/security/java.security"
请注意,低值会增加 DNS 欺骗攻击的风险。