# sonarqube 信息
* host：http://121.204.249.37:9100
* token：`8c31d6b3a1b0680b07eb009d68398bc8495c74f9`
* 帐号：sonar-develop
* 密码：Sonar@develop123

# 前提说明：
版本支持参考：[8.9版本](https://docs.sonarsource.com/sonarqube-server/8.9/requirements/prerequisites-and-overview/)
1. sonarqube对jdk有版本要求  
***说明：最新版本sonarqube 10.8要求jdk17，如果项目使用jdk1.8，最高版本只能是sonarqube 8.9。***
2. sonarqube对数据库也有要求，高版本只支持postgreSQL，SqlServer，Oracle，同时对版本也有要求；
3. maven的sonarscanner插件，新旧版本支持的属性也有些不同，比如：sonnar.login和password在新版本已过期，需要使用sonar.token等  
[最新版本属性](https://docs.sonarsource.com/sonarqube-server/latest/analyzing-source-code/analysis-parameters/) 
[8.9版本属性](https://docs.sonarsource.com/sonarqube-server/8.9/analyzing-source-code/analysis-parameters/)

### 1. docker安装
根据需要安装对应的版本，官方安装文档参考：
[8.9版本](https://docs.sonarsource.com/sonarqube-server/8.9/setup-and-upgrade/install-the-server/)
[最新版本](https://docs.sonarsource.com/sonarqube-server/latest/setup-and-upgrade/install-the-server/installing-sonarqube-from-docker/)  
**docker-compose.yml配置文件如下：**

```
   version: "3"
   services:
      sonarqube:
         image: sonarqube:8.9.10-community
         depends_on:
         - postgres
         environment:
           SONAR_JDBC_URL: jdbc:postgresql://postgres:5432/sonar
           SONAR_JDBC_USERNAME: sonar
           SONAR_JDBC_PASSWORD: sonar
         volumes:  #注意：需要设置/data/module/sonarqube目录权限755
         - /data/module/sonarqube/data:/opt/sonarqube/data
         - /data/module/sonarqube/extensions:/opt/sonarqube/extensions
         - /data/module/sonarqube/logs:/opt/sonarqube/logs
         ports:
         - "9000:9000"
      postgres:
         image: postgres:15
         environment:
           POSTGRES_USER: sonar
           POSTGRES_PASSWORD: sonar
           POSTGRES_DB: sonar
         volumes:
         - /data/module/postgresql:/var/lib/postgresql
         - /data/module/postgresql/data:/var/lib/postgresql/data
```

### 2. sonarqube的插件安装
- 插件安装也需要对照版本
   [8.9版本](https://docs.sonarsource.com/sonarqube-server/8.9/instance-administration/plugin-version-matrix/)
   [最新版本](https://docs.sonarsource.com/sonarqube-server/latest/setup-and-upgrade/plugins/plugin-version-matrix/)
  - 离线安装plugins  
  从版本对照找到适合的插件版本下载jar包，放入`$SONAR_HOME/extensions/plugins`目录即可，
     推荐安装的插件有：
    - Chinese Pack
    - checkstyle
    - p3c-pmd【阿里代码规约，需要自己下载源码编译，[github地址](https://github.com/caowenliang/sonar-pmd-p3c) 】
- 代码规则配置：在p3c-pmd的基础上，添加sonar默认的一些规则；
- 质量阈自定义配置【否则都是成功】。

### 3. jenkins支持sonarqube
   [8.9版本](https://docs.sonarsource.com/sonarqube-server/8.9/analyzing-source-code/scanners/sonarscanner-for-jenkins/)
   [最新版本](https://docs.sonarsource.com/sonarqube-server/latest/analyzing-source-code/scanners/jenkins-extension-sonarqube/)
   
- 插件的方法使用说明和环境变量[参考地址](https://www.jenkins.io/doc/pipeline/steps/sonar/)
- 如果jenkins插件市场搜索到的SonarQube Scanner版本不对照，可以从该链接地址 [下载](https://plugins.jenkins.io/sonar/releases/) 手动安装
1. 在SonarQube中（配置->网络调用）创建jenkins的webhook地址：  
   `http://[jenkins_url]/sonarqube-webhook/`
2. jenkisfile写法参考：

```
node {
    stage('SonarQube analysis') {
      withSonarQubeEnv('My SonarQube Server') {
         sh 'mvn clean package sonar:sonar'
       } // submitted SonarQube taskId is automatically attached to the pipeline context
    }
   
   // No need to occupy a node
   stage("Quality Gate"){
      timeout(time: 1, unit: 'HOURS') { // Just in case something goes wrong, pipeline will be killed after a timeout
         def qg = waitForQualityGate() // Reuse taskId previously collected by withSonarQubeEnv
         if (qg.status != 'OK') {
           error "Pipeline aborted due to quality gate failure: ${qg.status}"
         }
      }
   }
   
   或者
   
   stage("Quality Gate") {
      steps {
         timeout(time: 1, unit: 'HOURS') {
            // Parameter indicates whether to set pipeline to UNSTABLE if Quality Gate fails
            // true = set pipeline to UNSTABLE, false = don't
            waitForQualityGate abortPipeline: true
         }
      }
   }
}
```

### 4. ~~【后端开发】idea添加sonar插件~~
1. 插件市场名字：SonarQube for IDE， 别名：SonarLint  
   [插件官网地址](https://plugins.jetbrains.com/plugin/7973-sonarqube-for-ide)  
   配置了远程SonarQube的hostUrl和token以后可以使用。  
**注意：** 下载sonarLint的版本要与sonarQube服务端版本(版本号：8.9)匹配，否则使用不了。
2. 插件的作用：
- 在代码开发过程中，检测到代码质量问题，  
- git提交代码之前sonarLint会提示代码commit的代码有哪些问题。  
【目的】：做到提前修复，避免在jenkins部署时候出现一堆需要修改的代码耽误部署时间。

> （1）该插件只能检测sonarqube默认的规则，不能检测阿里巴巴的基于pmd的p3c规则, 原因：https://blog.csdn.net/weixin_42617348/article/details/81170166；  
> （2）开发过程中，要通过maven的sonar插件规则校验。

### ~~5. 【后端开发】sonar-maven-plugin插件安装使用~~
maven配置参考官网
[8.9版本](https://docs.sonarsource.com/sonarqube-server/8.9/analyzing-source-code/scanners/sonarscanner-for-maven/)
[最新版本](https://docs.sonarsource.com/sonarqube-server/latest/analyzing-source-code/scanners/sonarscanner-for-maven/)  
项目模块使用方式：
* pom.xml升级parent依赖，com.platomix:platomix-pom:1.2.2；
* 执行命令`mvn clean package sonar:sonar` 或者 直接使用sonar-scanner软件扫描。

### 6. 【后端开发】maven-pmd-plugin插件安装使用
1. 每个项目的根目录下放置[ali-pmd.xml](ali-pmd.xml)文件；
2. pom.xml升级parent依赖，com.platomix:platomix-pom:1.2.4；
3. 开发过程中，通过idea的Alibaba Java Code Guidelines插件扫描，然后通过clean package时，会通过maven-pmd-plugin插件检测代码（检测规则与插件差不多，比插件会少一些）。

> 问：为什么JAVA后端不使用sonar插件结合SonarQube服务做静态代码检测？  
> 答：主要原因是想使用ali-p3c代码校验规则，导致在开发过程中无法快捷方便的检测，详细情况如下：  
> （1）SonarQube支持基于pmd的p3c代码规则，但是IDEA插件SonarLint不支持【仅支持SonarQube的默认规则，原因：https://blog.csdn.net/weixin_42617348/article/details/81170166 】，导致开发过程中不能便捷检测；    
> （2）maven-sonar-plugin支持检测p3c代码规则，不过每次都需要执行sonar:sonar命令，返回一个报告地址，需要去SonarQube服务页面上查看检测结果；  
> （3）jenkins通过maven-sonar-plugin插件可以集成sonar静态代码检测，并且可以阻塞获取检测结果，成功：进入下一个节点；失败：停止部署发版；  
> （4）IDEA的Alibaba Java Code Guidelines插件是专门检测p3c代码规则的，检测规则在ali-pmd.xml文件中(做了一些修改，去掉了一些规则，比如：UndefineMagicConstantRule)；  
> （5）maven-pmd-plugin通过ali-pmd.xml可以与IDEA的Alibaba Java Code Guidelines插件保持相对一致的代码检测规则，这样在开发和发版过程都可以方便快捷的解决代码质量问题。  
> **综上所述：最后选择使用maven-pmd-plugin插件配合自定义的代码检测规则ali-pmd.xml来做静态代码检测。**

### 7. 【前端开发】vscode添加sonar插件
1. 插件市场名字：SonarQube for IDE: Visual Studio Code (formerly SonarLint)  
[插件官网地址](https://marketplace.visualstudio.com/items?itemName=SonarSource.sonarlint-vscode)  
**注意：** 下载sonarLint的版本要与sonarQube服务端版本(版本号：8.9)匹配，否则使用不了，插件作用参考4。

### 8. 【前端开发】sonar-scanner扫描
1. 安装sonnar-scanner软件包 [下载地址](https://docs.sonarsource.com/sonarqube-server/8.9/analyzing-source-code/scanners/sonarscanner/)  
2. 配置环境变量  
```
SONAR_SCANNER_HOME=/path/to/sonar-scanner-[version]  
PATH=$SONAR_SCANNER_HOME/bin:$PATH
```
3. 在项目的根目录下创建sonar-project.properties文件，内容如下【注意：修改projectName为项目名称】：
```
#项目标识【必需】- 自行修改projectName
sonar.projectKey=com.platomix:[projectName]
#项目名称【必需】- 自行修改projectName
sonar.projectName=[projectName]
# 指定 SonarQube 服务器地址
sonar.host.url=http://121.204.249.37:9100
#项目版本号【可选】
#sonar.projectVersion=1.0
sonar.verbose=true
sonar.login=8c31d6b3a1b0680b07eb009d68398bc8495c74f9
# 需要分析的源码目录
sonar.sources=src
#源码的默认编码
sonar.sourceEncoding=UTF-8
#忽略文件
sonar.exclusions=node_modules\**\*
```
4. 在package.json中添加配置：
```
{
   ...
   scripts: {
   //根据项目的情况，后面添加" & sonar-scanner"
   "eslint": "eslint & sonar-scanner"    
   }
}
```