SonarQube-jenkins集成

root
233
文章
0
评论
2021年10月14日13:51:28 评论 5766字阅读19分13秒

SonarQube-jenkins集成

两种方式: 1. 使用命令行方式 2. 使用Jenkins扩展插件的方式。

1.4.1 命令行方式

流水线中添加代码扫描阶段, 然后在script标签中定义一段脚本。 (其实这段脚本就是我们手动在服务器上面执行的sonar-scanner的命令和参数组成的)【可以先运行该段代码确保扫描成功,然后进一步优化】

	stage("SonarScan"){
            steps{
                script{
                    sh """
                        sonar-scanner \
                          -Dsonar.projectKey=demo-devops-service \
                          -Dsonar.projectName=demo-devops-service \
                          -Dsonar.sources=src \
                          -Dsonar.host.url=http://192.168.1.200:9000 \
                          -Dsonar.login=0809881d71f2b06b64786ae3f81a9acf22078e8b \
                          -Dsonar.projectVersion=1.0 \
                          -Dsonar.ws.timeout=30 \
                          -Dsonar.projectDescription="my first project!" \
                          -Dsonar.links.homepage=http://192.168.1.200/devops/devops-maven-service \
                          -Dsonar.links.ci=http://192.168.1.200:8080/job/demo-pipeline-service/ \
                          -Dsonar.sourceEncoding=UTF-8 \
                          -Dsonar.java.binaries=target/classes \
                          -Dsonar.java.test.binaries=target/test-classes \
                          -Dsonar.java.surefire.report=target/surefire-reports
                       """
                }
            }
        }
   }

通过上面的代码可以发现一些问题:

  • 扫描参数值都是写死的,无法使其他项目通用。
  • 代码中存在敏感数据信息。

既然想通用,就要制定规范。 例如:

  • 我们统一使用Jenkins的作业名称做为SonarQube项目名称。
  • 将Sonar在进行扫描时用到的认证信息,也存储到Jenkins的系统凭据中(Secret Text类型),避免流水线中存在敏感信息。然后使用withCredentials将凭据的值内容赋值给变量SONAR_TOKEN引用。
  • 使用BUILD_NUMBER作为sonarqube项目版本(可以使用时间戳、版本号、commitid)。
  • -Dsonar.links.ci=${BUILD_URL} SonarQube的扩展链接, 方便在系统中跳转。
  • -Dsonar.links.homepage=${env.srcUrl} SonarQube的扩展链接, 方便在系统中跳转。

优化后:

        stage("Sonarqube"){
            steps{
                script {
                    println("运行测试")
                    groupName = "${JOB_NAME}".split("/")[0]
                    projectName = "${JOB_NAME}".split("/")[-1]
                    sh """
                    sonar-scanner -Dsonar.host.url=http://192.168.1.110:9000 \
                    -Dsonar.projectKey=${projectName} \
                    -Dsonar.projectName=${projectName} \
                    -Dsonar.projectVersion=${BUILD_ID} \
                    -Dsonar.login=admin \
                    -Dsonar.password=admin123 \
                    -Dsonar.ws.timeout=30 \
                    -Dsonar.projectDescription="my first project!" \
                    -Dsonar.links.homepage=http://192.168.1.110:9080/${groupName}/${projectName} \
                    -Dsonar.links.ci=http://192.168.1.110:8080/${groupName}/demo/job/${projectName} \
                    -Dsonar.sources=/data/demo-maven/demo/src \
                    -Dsonar.sourceEncoding=UTF-8 \
                    -Dsonar.java.binaries=/data/demo-maven/demo/target/classes \
                    -Dsonar.java.test.binaries=/data/demo-maven/demo/target/test-classes \
                    -Dsonar.java.surefire.report=/data/demo-maven/demo/target/surefire-reports
                    """
                }
            }
        }

 

敏感信息处理

  • 避免流水线中存在敏感信息。然后使用withCredentials将凭据的值内容赋值给变量sonar_token引用

sonarqube生产tonken

jenkins添加sonarqube的凭据

系统管理--凭据--全局凭据 详细查看 持续集成系统Jenkins[权限管理|凭据管理|BlueOcean UI]

凭据生产

pipline中引用

//gitlab传递的数据{}
println("${webhookdata}")

def buildTools = ["maven": "/data/apache-maven-3.8.3/"]


//数据格式化
webhookdata = readJSON text: "${webhookdata}"

//提取仓库信息
env.srcUrl= webhookdata["project"]["git_http_url"]   //项目地址
env.branchName= webhookdata["ref"]-"refs/heads/"      // 分支
env.commitId= webhookdata["checkout_sha"]            //提交id
env.commitUser= webhookdata["user_username"]         // 提交人
env.userEmail = webhookdata["user_email"]            //邮箱

currentBuild.description = "Trigger by Gitlab \n branch: ${env.branchName} \n user: ${env.commitUser} "
currentBuild.displayName = "${env.commitId}"

pipeline{
    //指定运行此流水线的节点,指定标签的名字
    agent { node { label "build"}}
    stages{
        //阶段1 获取代码
        stage("CheckOut"){
            //定义阶段1的变量
            environment {
                NAME = "hwf01"
                VERSION = "1.1.11"
                ENVTYPE = "DEV1"
            }
            steps{
                script{
                    //branchName = "${params.branchName}"
                    //srcUrl = "${params.srcUrl}"
                    checkout([$class: 'GitSCM', branches: [[name: "${env.branchName}"]],
                              extensions: [],
                              userRemoteConfigs: [[credentialsId: 'gitlab-root',
                                                   url: "${env.srcUrl}"]]])
                }
            }
        }
        stage("Build") {
            steps {
                script {
                    println("运行构建")
                    //要是想获取input的值,打印他的环境变量
                    sh "${buildTools["maven"]}/bin/mvn clean package -DskipTests -f demo/pom.xml \
                        -s settings.xml"
                }
            }
        }
        stage("Test"){
            steps{
                script {
                    println("运行测试")
                    sh "${buildTools["maven"]}/bin/mvn test -f demo/pom.xml \
                        -s settings.xml"
                    junit 'demo/target/surefire-reports/*.xml'
                }
            }
        }

        stage("Sonarqube"){
            steps{
                script {
                    println("运行扫描")
                    groupName = "${JOB_NAME}".split("/")[0]
                    projectName = "${JOB_NAME}".split("/")[-1]
                    withCredentials([string(credentialsId: '9a2fd415-eebb-403b-9116-db07f9ae2605', variable: 'AUTH_TOKEN')]) {
                    sh """
                    sonar-scanner -Dsonar.host.url=http://192.168.1.110:9000 \
                    -Dsonar.projectKey=${projectName} \
                    -Dsonar.projectName=${projectName} \
                    -Dsonar.projectVersion=${BUILD_ID} \
                    -Dsonar.login=${AUTH_TOKEN} \
                    -Dsonar.ws.timeout=30 \
                    -Dsonar.projectDescription="my first project!" \
                    -Dsonar.links.homepage=http://192.168.1.110:9080/${groupName}/${projectName} \
                    -Dsonar.links.ci=http://192.168.1.110:8080/job/${groupName}/job/${projectName} \
                    -Dsonar.sources=/data/demo-maven/demo/src \
                    -Dsonar.sourceEncoding=UTF-8 \
                    -Dsonar.java.binaries=/data/demo-maven/demo/、/target/classes \
                    -Dsonar.java.test.binaries=/data/demo-maven/demo/target/test-classes \
                    -Dsonar.java.surefire.report=/data/demo-maven/demo/target/surefire-reports                   
                    """
                    }
                }
            }
        }

    }
    post {
        always{
            script{
                println("流水线结束后,经常做的事情")
                //EmailUser("${env.userEmail}", currentBuild.currentResult)
            }
        }

        success{
            script{
                println("流水线成功后,要做的事情")
            }

        }
        failure{
            script{
                println("流水线失败后,要做的事情")
            }
        }

        aborted{
            script{
                println("流水线取消后,要做的事情")
            }

        }
    }
}

 

1.4.2 插件方式

....

jenkins添加sonarqube的凭据...

....

在Jenkins中安装插件sonarqube scanner。

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

在片段生成器中查看用法, 注入与所选SonarQube 安装相关的环境变量。将设置以下变量:

SONAR_HOST_URL     ## 在jenkins管理页面配置的sonar地址
SONAR_AUTH_TOKEN   ## 在jenkins管理页面配置的sonar认证信息

此处生成的代码有问题, 推荐直接看下我提供的模板。

使用withSonarQubeEnv DSL引入在Jenkins中配置的sonar环境。

## 括号中的`mysonar`一定要与Jenkins设置页面定义的一致。
  stage("SonarScan"){
            steps {
                script{
                    groupName = "${JOB_NAME}".split("/")[0]
                    projectName = "${JOB_NAME}".split("/")[-1] //devops03/devops03-maven-service
                    //sonar.CodeSonar("${env.buildTool}", projectName, groupName )
                    
                    withSonarQubeEnv("mysonar") {
                        sh """
                            sonar-scanner -Dsonar.host.url=${SONAR_HOST_URL} \
                                -Dsonar.projectKey=${projectName} \
                                -Dsonar.projectName=${projectName} \
                                -Dsonar.projectVersion=${BUILD_ID} \
                                -Dsonar.login=${SONAR_AUTH_TOKEN} \
                                -Dsonar.ws.timeout=30 \
                                -Dsonar.projectDescription="my first project!" \
                                -Dsonar.links.homepage=http://192.168.1.110/${groupName}/${projectName} \
                                -Dsonar.links.ci=http://192.168.1.110:8080/job/${groupName}/job/${projectName}/ \
                                -Dsonar.sources=src \
                                -Dsonar.sourceEncoding=UTF-8 
                        """
                    }
                }
            }

最终的效果如下:

相比命令行只是增加了一些扩展链接, 对于经常操作Jenkins的用户方便些。

 

继续阅读
weinxin
我的微信
这是我的微信扫一扫
  • 文本由 发表于 2021年10月14日13:51:28
  • 除非特殊声明,本站文章均为原创,转载请务必保留本文链接
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: