根据SonarQube官方描述,SonarQube由三个组件组成:

SonarQube Server,运行如下进程:
- 一个服务于SonarQube用户界面的web服务器
- 基于Elasticsearch的搜索服务器
- 负责处理代码分析报告并将其保存在SonarQube数据库中的计算引擎
Database Server,主要存储如下内容:
- 在代码扫描期间生成的代码质量和安全性的度量和问题
- SonarQube实例配置
Scanner:
- 扫描器,用以分析项目
SonarQube Web API没有提供分析代码的接口,因为分析代码是scanner的职责,因此,我们要在出包前自动执行sonarqube,思路就是先要执行sonarqube scanner,然后再通过接口获取执行报告。
def executed = false
project.publish.doFirst {
    if (!executed && "csf-parent" == project.name) {
        // 标记为已执行,避免重复执行
        executed = true
        // 执行sonarqube
        exec {
            workingDir "${rootDir}"
            commandLine "gradle.bat", "sonarqube"
        }
        // 获取gradle.properties配置参数
        def properties = project.getProperties()
        def projectKey = properties.get("systemProp.sonar.projectKey")
        def hostUrl = properties.get("systemProp.sonar.host.url")
        def login = properties.get("systemProp.sonar.login") + ":"
        def token = login.getBytes(StandardCharsets.UTF_8).encodeBase64Url(true).toString()
        // 获取sonarqube执行结果
        def connection = new URL(hostUrl + "/api/qualitygates/project_status?projectKey=" + projectKey).openConnection()
        connection.setRequestMethod("GET")
        connection.setDoOutput(true)
        connection.setRequestProperty("Content-Type", "application/json")
        connection.setRequestProperty("Authorization", "Basic " + token)
        def code = connection.getResponseCode()
        if (code != 200) {
            throw new GradleException("获取sonarqube结果失败!")
        }
        def text = connection.getInputStream().getText()
        def slurper = new groovy.json.JsonSlurper()
        def json = slurper.parseText(text)
        def status = json.projectStatus.status
        if ("ERROR".equalsIgnoreCase(status)) {
            throw new GradleException("sonarqube检测不通过!")
        }
    }
}


















