DevOps(6)--SonarQube代码扫描

代码扫描

1. 安装SonarQube扫描器

地址:https://docs.sonarqube.org/latest/analyzing-source-code/scanners/sonarscanner/

这里我们下载windows版本

这个需要确保你有jdk环境。

2. 扫描go代码

接下来找一个go项目进行扫描。

在go项目根目录下配置sonar.properties

# must be unique in a given SonarQube instance
sonar.projectKey=msgo

# --- optional properties ---

# defaults to project key
#sonar.projectName=My project
# defaults to 'not provided'
sonar.projectVersion=1.0
 
# Path is relative to the sonar-project.properties file. Defaults to .
sonar.sources=.
 
# Encoding of the source code. Default is default system encoding
sonar.sourceEncoding=UTF-8

sonar.login=admin
sonar.password=123456
sonar.host.url=http://192.168.200.101:31124
sonar.exclusions=**/*_test.go
sonar.tests=.
sonar.test.inclusions=**/*_test.go
sonar.language=go

执行扫描

在要扫描的项目根目录下运行:

E:\develop\sonar-scanner-4.8.0.2856-windows\bin\sonar-scanner.bat -Dproject.settings=./sonar.properties

3. 插件方式

地址:https://www.sonarsource.com/products/sonarlint/

目前还没有对goland做支持。

以idea为例

4. Jenkins集成

前面的学习中,我们学习了Jenkins,我们接下来要做的就是将sonar集成到jenkins中,让其自动扫描代码。

安装扫描插件,同时安装http request插件和 Pipeline Utility StepsVersion插件

在sonar中生成token

在jenkins中设置凭据

转到"管理Jenkins>系统配置",向下滚动到SonarQube配置部分,单击Add SonarQube,添加服务器,选择凭据

4.1 新建任务

4.2 配置scanner

def HttpReq(reqType,reqUrl,reqBody){
    sonarServer = "http://sonarqube.sonar.svc.cluster.local:9000/api"
    // 可以不加authentication认证,因为默认不需要
    result = httpRequest authentication: '322b1713-09d8-4d60-b438-feac0777d55e',
            httpMode: reqType, 
            contentType: "APPLICATION_JSON",
            consoleLogResponseBody: true,
            ignoreSslErrors: true, 
            requestBody: reqBody,
            url: "${sonarServer}/${reqUrl}"
            //quiet: true
    
    return result
}


//获取Sonar质量阈状态
def GetProjectStatus(projectName){
    apiUrl = "project_branches/list?project=${projectName}"
    response = HttpReq("GET",apiUrl,'')
    
    response = readJSON text: """${response.content}"""
    result = response["branches"][0]["status"]["qualityGateStatus"]
    
    println(response)
    
   return result
}

pipeline{
    agent {
         label 'ms-jenkins'
    }
     environment {
        mvnPATH = "/var/jenkins_home/mvn/bin"
        projectName = "${env.JOB_NAME}"
        branchName = "master"
    }
    stages {
        stage('SonarQube analysis'){
            steps{
                script{
                        sonarDate = sh  returnStdout: true, script: 'date  +%Y%m%d%H%M%S'
                        sonarDate = sonarDate - "\n"
                        scannerHome = tool 'sonarqube'               
                    }
                
                withSonarQubeEnv('sonarqube') {
                    sh "pwd;ls ./ ;${scannerHome}/bin/sonar-scanner -Dsonar.projectKey=testgo  -Dsonar.sources=. -Dsonar.exclusions=**/*_test.go   -Dsonar.login=squ_0f3342fb7392e7165864235913b4c10de1eb4fb3"
                }
                script{
                        result = GetProjectStatus("${projectName}")
                        if ("${result}" == "OK"){
                            println("代码检测通过 ")
                        }else{
                            error "代码检测不通过"
                        }
                        // println("${result}")
                    }
            }  
            
        }
        }

}


DevOps(6)--SonarQube代码扫描
http://47.123.5.226:8090//archives/devops-6---sonarqubedai-ma-sao-miao
作者
pony
发布于
2024年05月06日
许可协议