一 、 先決條件和概述
JDK
| Java | Server | Scanners |
|---|---|---|
| Oracle JRE | 11 | ≥8 |
| OpenJDK | 11 | ≥8 |
數據庫
| 數據庫 | 版本 | 備注 |
|---|---|---|
| PostgreSQL | ≥9.3 | UTF-8 charset |
| Oracle | ≥11g | UTF-8 charset |
| MSSQL | ≥14 |
硬件要求
實例至少需要2GB的RAM才能有效運行,而OS則需要1GB的可用RAM。
企業建議配置: 8C16G
Linux配置要求:
-
vm.max_map_count大於或等於524288 -
fs.file-max大於或等於131072 -
運行SonarQube的用戶可以打開至少131072個文件描述符
-
運行SonarQube的用戶可以打開至少8192個線程
檢查方法
sysctl vm.max_map_count
sysctl fs.file-max
ulimit -n
ulimit -u
內核支持seccomp過濾器
默認情況下,Elasticsearch使用seccomp filter。
$ grep SECCOMP /boot/config-$(uname -r)
字體
-
Fontconfig已安裝在托管SonarQube的服務器上
-
SonarQube服務器上安裝了FreeType字體包。可用的確切軟件包會因分發而異,但是常用的軟件包是
libfreetype6
二、 在Docker上安裝
2.1 配置系統參數
修改/etc/sysctl.d/99-sonarqube.conf
vm.max_map_count=534288
fs.file-max=141072
讓其生效
sysctl -p /etc/sysctl.d/99-sonarqube.conf
2.2 編寫docker-compose
/docker-compose/sonarqube/docker-compose.yml
參考: https://github.com/SonarSource/docker-sonarqube
version: "3"
services:
sonarqube:
image: sonarqube:8.2-community
depends_on:
- db
ports:
- "9000:9000"
networks:
- sonarnet
environment:
SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar
SONAR_JDBC_USERNAME: sonar
SONAR_JDBC_PASSWORD: sonar
volumes:
- sonarqube_data:/opt/sonarqube/data
- sonarqube_extensions:/opt/sonarqube/extensions
- sonarqube_logs:/opt/sonarqube/logs
- sonarqube_temp:/opt/sonarqube/temp
db:
image: postgres
networks:
- sonarnet
environment:
POSTGRES_USER: sonar
POSTGRES_PASSWORD: sonar
volumes:
- postgresql:/var/lib/postgresql
# This needs explicit mapping due to https://github.com/docker-library/postgres/blob/4e48e3228a30763913ece952c611e5e9b95c8759/Dockerfile.template#L52
- postgresql_data:/var/lib/postgresql/data
networks:
sonarnet:
driver: bridge
volumes:
sonarqube_data:
sonarqube_extensions:
sonarqube_logs:
sonarqube_temp:
postgresql:
postgresql_data:
2.3 啟動
cd /docker-compose/sonarqube
docker-compose up
初始賬戶和密碼: admin/admin
三、 服務器配置
3.1 安裝中文插件
Administration --> Marketplace
搜索Chinese Pack
3.2 修改初始密碼
配置 > 權限 > 用戶
選擇admin用戶,點擊輪滑按鈕,選擇重置密碼
3.3 創建新用戶並生成token
配置 > 權限 > 用戶 > 創建用戶
創建完成后點擊令牌
並記住令牌
四、 Jenkins與SonarQube集成插件的安裝與配置
4.1 安裝Jenkins的SonarScanner
-
系統管理 > 插件管理 > 可選插件
-
搜索SonarQube Scanner
-
點擊直接安裝
4.2 配置SonarQube服務器
Jenkins面板點擊:系統管理 > 系統配置 > SonarQube servers > Add SonarQube
填入
Name: Frog
Server URL: http://192.168.0.80:9000
Token: 注意新加token,選擇類型為Sercet file
4.3 安裝SonarQube Scanner
wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.4.0.2170-linux.zip
unzip sonar-scanner-cli-4.4.0.2170-linux.zip
4.4 配置Sonar Scanner
編輯/opt/sonar-scanner-4.4.0.2170-linux/conf/sonar-scanner.properties
sonar.host.url=http://192.168.0.80:9000
sonar.sourceEncoding=UTF-8
4.5 配置 Sonar Scanner
進入Jenkins系統管理 > 全局工具配置
點擊新增SonarQube Scanner,不勾選自動安裝,
配置SonarQube Scanner
Name: sonar
Sonar_Runner_Home: /opt/sonar-scanner-4.4.0.2170-linux
點擊“保存”
4.6 Jenkins配置檢查任務
Jenkins > 項目 > 增加構建任務
選擇Execute SonarQube Scanner
Task to run: scan # 即分析代碼
Path to project properties: 這里可以指定一個 sonar-project.properties 文件,如果不指定的話會使用項目默認的 properties 文件
Analysis properties : 這里需要輸入一些配置參數用來傳遞給 SonarQube,
這里的參數優先級高於 sonar-project.properties 文件里面的參數,
所以可以在這里來配置所有的參數以替代 sonar-project.properties 文件
sonar.projectKey=eploicy:print
sonar.projectName=Winglung Epolicy Print
sonar.projectVersion=1.0
sonar.language=java
sonar.sourceEncoding=GBK
sonar.java.binaries=$WORKSPACE/webapps/WEB-INF/classes
sonar.sources=$WORKSPACE/component/com/sinosoft/application
注解:
sonar.projectKey:
sonar.java.binaries: 項目編譯后二進制文件存放目錄
sonar.sources: 需要分析的Java源碼目錄
開啟debug模式
Additional arguments: -X
JVM Options: -Xmx2048m -Xms256m -XX:+HeapDumpOnOutOfMemoryError
五、 使用Ant和SonarScanner集成
5.1 下載SonarScanner for Ant
cd /opt
wget https://binaries.sonarsource.com/Distribution/sonarqube-ant-task/sonarqube-ant-task-2.7.0.1612.jar
5.2 編寫項目的build.xml
參考: https://github.com/SonarSource/sonar-scanning-examples
<?xml version="1.0" encoding="UTF-8"?>
<project name="Simple Project analyzed with the SonarQube Scanner for Ant" default="all" basedir="." xmlns:sonar="antlib:org.sonar.ant">
<!-- ========= Define the main properties of this project ========= -->
<property name="src.dir" value="src" />
<property name="build.dir" value="target" />
<property name="classes.dir" value="${build.dir}/classes" />
<!-- Define the SonarQube global properties (the most usual way is to pass these properties via the command line) -->
<property name="sonar.host.url" value="http://192.168.0.80:9000" />
<!-- Define the Sonar properties -->
<property name="sonar.projectKey" value="org.sonarqube:sonarqube-scanner-ant" />
<property name="sonar.projectName" value="Example of SonarQube Scanner for Ant Usage" />
<property name="sonar.projectVersion" value="1.0" />
<property name="sonar.sources" value="src" />
<property name="sonar.binaries" value="target" />
<property name="sonar.sourceEncoding" value="UTF-8" />
<!-- ========= Define "regular" targets: clean, compile, ... ========= -->
<target name="clean">
<delete dir="${build.dir}" />
</target>
<target name="init">
<mkdir dir="${build.dir}" />
<mkdir dir="${classes.dir}" />
</target>
<target name="compile" depends="init">
<javac srcdir="${src.dir}" destdir="${classes.dir}" fork="true" debug="true" includeAntRuntime="false" />
</target>
<!-- ========= Define SonarQube Scanner for Ant Target ========= -->
<target name="sonar" depends="compile">
<taskdef uri="antlib:org.sonar.ant" resource="org/sonar/ant/antlib.xml">
<!-- Update the following line, or put the "sonar-ant-task-*.jar" file in your "$HOME/.ant/lib" folder -->
<classpath path="/opt/sonarqube-ant-task-2.7.0.1612.jar" />
</taskdef>
<!-- Execute SonarQube Scanner for Ant Analysis -->
<sonar:sonar />
</target>
<!-- ========= The main target "all" ========= -->
<target name="all" depends="clean,compile,sonar" />
</project>
六、 使用Manev和SonarScanner集成
6.1 Maven的全局設置
在$MAVEN_HOME/conf 或者 ~/.m2目錄下的setting.xml中配置
<settings>
<pluginGroups>
<pluginGroup>org.sonarsource.scanner.maven</pluginGroup>
</pluginGroups>
<profiles>
<profile>
<id>sonar</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<!-- Optional URL to server. Default value is http://localhost:9000 -->
<sonar.host.url>
http://myserver:9000
</sonar.host.url>
</properties>
</profile>
</profiles>
</settings>
6.2 pom.xml配置參數
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven.compiler.release>11</maven.compiler.release>
</properties>
6.3 分析
mvn clean verify sonar:sonar -Dsonar.login=myAuthenticationToken
或者
mvn clean install mvn sonar:sonar -Dsonar.login=myAuthenticationToken
要指定sonar-maven-plugin的版本而不是使用最新的版本:
mvn org.sonarsource.scanner.maven:sonar-maven-plugin:3.7.0.1746:sonar
建議鎖定Maven插件的版本:
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.sonarsource.scanner.maven</groupId>
<artifactId>sonar-maven-plugin</artifactId>
<version>3.7.0.1746</version>
</plugin>
</plugins>
</pluginManagement>
</build>
6.4 故障排除
如果收到java.lang.OutOfMemoryError
設置MAVEN_OPTS環境變量,例如在* nix環境中:
export MAVEN_OPTS="-Xmx512m"
