## :-: 采用SonarQube進行代碼規范及單元測試覆蓋率檢查
## 一、SonarQube安裝
### 1.1 臨時修改配置
sysctl -w vm.max_map_count=262144
### 1.2 docker-compose up -d
```
version: "3"
services:
postgres:
image: postgres:12
networks:
- sonarnet
restart: always
container_name: postgres
ports:
- "5432:5432"
environment:
- POSTGRES_USER=sonar
- POSTGRES_PASSWORD=sonar
volumes:
- postgresql_data:/var/lib/postgresql/data
sonarqube:
image: sonarqube:8.2-community
ports:
- "9000:9000"
networks:
- sonarnet
restart: always
container_name: sonar
depends_on:
- postgres
environment:
SONARQUBE_JDBC_USERNAME: sonar
SONARQUBE_JDBC_PASSWORD: sonar
SONARQUBE_JDBC_URL: jdbc:postgresql://postgres:5432/sonar
volumes:
- sonarqube_conf:/opt/sonarqube/conf
- sonarqube_data:/opt/sonarqube/data
- sonarqube_extensions:/opt/sonarqube/extensions
- sonarqube_bundled-plugins:/opt/sonarqube/lib/bundled-plugins
networks:
sonarnet:
driver: bridge
volumes:
sonarqube_conf:
sonarqube_data:
sonarqube_extensions:
sonarqube_bundled-plugins:
postgresql_data:
```
### 1.3 訪問
http://ip:9000,管理員默認賬號和密碼為admin/admin

### 1.4 中文插件安裝

## 二、SonarQube安裝P3C插件
### 2.1 下載插件代碼并構建
```
>git clone https://github.com/rhinoceros/sonar-p3c-pmd
>cd sonar-pmd-p3c
>mvn clean install -Dmaven.test.skip=true
```
注意:驗證時是直接從https://github.com/rhinoceros/sonar-p3c-pmd/tags下載的`pmd-3.2.0-beta-with-p3c1.3.6-pmd6.10.0`
### 2.2 安裝插件
注意:由于sonar-pmd-p3c是在sonar-pmd-plugin基礎上修改的,所以如果已安裝sonar-pmd-plugin,需要先刪除原插件。
```
>rm -f /opt/sonarqube/extensions/plugins/sonar-pmd*
>cp sonar-pmd-p3c/target/sonar-pmd-plugin-3.2.1.jar /opt/sonarqube/extensions/plugins
```
### 2.3 配置
* 重啟 SonarQube,打開 質量配置`Quality Profiles`頁,點擊右上方的`創建`按鈕,創建`p3c profiles`

* 首次創建會跳轉到代碼規則配置頁面,剛新建的 profile 是沒有激活任何規則的,需要手動激活

* 跳轉到激活頁面,搜索p3c,如圖,都是以`[p3c]`開頭的規則

* 批量修改->活動 p3c -> 應用 -> 成功


* 綁定規則成功后基本完成,我們返回`質量配置`,在`java`選擇剛設置的`p3c`設置為默認

## 三、單元測試報告插件介紹
* 項目pom.xml配置
```
<!--不顯示引入,在執行 mvn test 命令時也會自動引入maven-surefire-plugin-->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<!--忽略mvn test 命令-->
<skip>false</skip>
<includes>
<include>**/*Test.java</include>
</includes>
<argLine>${surefireArgLine}</argLine>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-report-plugin</artifactId>
<configuration>
<aggregate>true</aggregate>
</configuration>
</plugin>
</plugins>
</build>
```
* 結果查看
surefire 插件會在mvn test命令后在/target/surefire-reports目錄中生成XML和TXT的單元測試報告,maven-surefire-report-plugin插件會把target/surefire-reports下的所有xml報告轉換成一份html格式的文件。并將這個html格式的測試報告保存在target/site目錄下如下:
**注意:maven-surefire-report-plugin插件需要單獨執行mvn surefire-report:report**

## 四、代碼覆蓋率插件介紹
Java中常用的代碼覆蓋率統計的插件有 JaCoCo 與Cobertura,推薦使用JaCoCo,下面是兩者對比:

* 項目pom.xml配置
```
<build>
<plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<executions>
<execution>
<id>pre-unit-test</id>
<goals>
<goal>prepare-agent</goal>
</goals>
<configuration>
<propertyName>surefireArgLine</propertyName>
</configuration>
</execution>
<execution>
<id>post-unit-test</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
<configuration>
<dataFile>${basedir}/target/jacoco.exec</dataFile>
<outputDirectory>${basedir}/target/site/jacoco</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
```
* 結果查看
執行 mvn test命令后在/target/jacoco.exec生成記錄文件,同時會將代碼執行情況文件轉換生成為 jacoco 報表,在/target/site/jacoco目錄下。

## 五、代碼檢查
`sonarqube`可以使用多種方式進行代碼檢查,我們使用簡單的`Maven`觸發代碼檢查。步驟如下:
1、maven 對項目進行編譯打包,并執行單元測試用例,mvn test package install
2、自動執行surfile 和 jacoco 插件
3、使用 mvn sonar:sonar 命令,將代碼覆蓋率報表推送到 sonarqube 平臺
4、登錄 sonarqube 查看代碼覆蓋率統計報告(也可以本地訪問 jacoco/index.html 直接查看報告)
* 項目pom.xml配置
```
<!--不顯示引入,在執行MAVEN命令時也會自動引入-->
<build>
<plugins>
<plugin>
<groupId>org.sonarsource.scanner.maven</groupId>
<artifactId>sonar-maven-plugin</artifactId>
<version>3.6.0.1398</version>
</plugin>
</plugins>
</build>
```
```
<profiles>
<profile>
<id>sonar</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<sonar.host.url>http://ip:9000</sonar.host.url>
<!--如果sonarQube項目配置的允許Anyone執行分析,則以下屬性不配置-->
<sonar.login>yjj</sonar.login>
<sonar.password>yjj</sonar.password>
</properties>
</profile>
</profiles>
```
* 先構建項目`mvn package`,注意package時要同時執行`mvn test`,再執行`mvn sonar:sonar`

* 查看報告

可以看到上傳的項目列表,選擇項目查看分析結果,項目健康狀態,代碼覆蓋率等信息
