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 插件方式
参考:https://docs.sonarqube.org/latest/analysis/scan/sonarscanner-for-jenkins/
创建SonaQube的账户token
....
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的用户方便些。
继续阅读

我的微信
这是我的微信扫一扫
评论