SonarQube-[jenkins共享库集成]
手动构建配置的话参考:Jenkins-提交流水线[手动触发|自动触发|提交优化]
共享库配置模板参考: 持续集成系统jenkins[全局变量|Groovy编程|共享库实践]
gitlab共享库内容
[root@jeekins /]# tree demo-sharedlibrary/ demo-sharedlibrary/ ├── demo │ ├── mvnw │ ├── mvnw.cmd │ ├── pom.xml │ └── src │ ├── main │ │ ├── java │ │ │ └── com │ │ │ └── example │ │ │ └── demo │ │ │ └── DemoApplication.java │ │ └── resources │ │ └── application.properties │ └── test │ └── java │ └── com │ └── example │ └── demo │ └── DemoApplicationTests.java ├── jenkinsfile ├── README.md ├── resources │ └── config.json ├── settings.xml ├── src │ └── hwf │ └── devops │ ├── Build.groovy │ ├── Checkout.groovy │ ├── Sonar.groovy │ └── UnitTest.groovy └── vars └── demoPipeline.groovy 18 directories, 15 files
Jenkinsfile
[root@jeekins demo-sharedlibrary]# cat jenkinsfile @Library("hwf@main") _ import hwf.devops.* // 导入库 def checkout = new Checkout() def build = new Build() def unittest = new UnitTest() def sonar = new Sonar() pipeline { agent { label "build" } stages{ stage("Checkout"){ steps{ script { println("GetCode") checkout.GetCode("${env.srcUrl}", "${env.branchName}") } } } stage("Build"){ steps{ script{ println("Build") build.CodeBuild("${env.buildTool}") } } } stage("UnitTest"){ steps{ script{ unittest.CodeTest("${env.buildTool}") } } } stage("SonarScan"){ steps { script{ groupName = "${JOB_NAME}".split("/")[0] projectName = "${JOB_NAME}".split("/")[-1] //devops03/devops03-maven-service sonar.CodeSonar("${env.buildTool}", projectName, groupName) } } } } }
Build.groovy
[root@jeekins devops]# cat Build.groovy package hwf.devops //Maven def MavenBuild(){ def buildTools = ["maven": "/data/apache-maven-3.8.3"] sh "${buildTools["maven"]}/bin/mvn clean package -DskipTests -f demo/pom.xml \ -s settings.xml" } //Gradle def GradleBuild(){ def buildTools = ["gradle": "/data/gradle-7.2"] sh "${buildTools["gradle"]}/bin/gradle clean && ${buildTools["gradle"]}/bin/gradle build -x test" } //Ant def AntBuild(configPath="./build.xml"){ sh "ant -f ${configPath}" } //Golang def GoBuild(){ def buildTools = ["go": "/data/go" ] sh "${buildTools["go"]}/bin/go build demo.go" } //Npm def NpmBuild(){ def buildTools = ["npm": "/data/node-v14.18.0-linux-x64" ] sh """ export PATH=\$PATH:${buildTools["npm"]}/bin ${buildTools["npm"]}/bin/npm install ${buildTools["npm"]}/bin/npm run build """ } //Yarn def YarnBuild(){ sh "yarn install && yarn build " } //Main def CodeBuild(type){ switch(type){ case "maven": MavenBuild() break; case "gradle": GradleBuild() break; case "npm": NpmBuild() break; case "yarn": YarnBuild() break; default: error "No such tools ... [maven/ant/gradle/npm/yarn/go]" break } }
Checkout.groovy
[root@jenkins devops]# cat Checkout.groovy package hwf.devops //下载代码 def GetCode(srcUrl, branchName){ checkout([$class: 'GitSCM', branches: [[name: branchName]], extensions: [], userRemoteConfigs: [[ credentialsId: 'gitlab-root', url: srcUrl]]]) }
Sonar.groovy
注意:sonarqube和jenkins集成的时候,项目地址在jenkins工作目录内,src的相对路径为jenkins工作目录
[root@jeekins devops]# cat Sonar.groovy package hwf.devops def SonarRequest(apiUrl,method){ withCredentials([string(credentialsId: "16ed65f2-1b1e-4fbb-b976-a5fd60698d60", variable: 'SONAR_TOKEN')]) { sonarApi = "http://192.168.1.110:9000/api" response = sh returnStdout: true, script: """ curl --location \ --request ${method} \ "${sonarApi}/${apiUrl}" \ --header "Authorization: Basic ${SONAR_TOKEN}" """ // json格式化 try { response = readJSON text: """ ${response - "\n"} """ } catch(e){ response = readJSON text: """{"errors" : true}""" } return response } } //查找项目 def SearchProject(projectName){ apiUrl = "projects/search?projects=${projectName}" response = SonarRequest(apiUrl,"GET") if (response.paging.total == 0){ return false } return true } //创建项目 def CreateProject(projectName){ apiUrl = "projects/create?name=${projectName}&project=${projectName}" response = SonarRequest(apiUrl,"POST") try{ if (response.project.key == projectName ) { println("Project Create success!...") return true } }catch(e){ println(response.errors) return false } } // 更新质量阈 def UpdateQualityProfiles(lang, projectName, groupName){ apiUrl = "qualityprofiles/add_project?language=${lang}&project=${projectName}&qualityProfile=${groupName}" response = SonarRequest(apiUrl,"POST") if (response.errors != true){ println("ERROR: UpdateQualityProfiles ${response.errors}...") return false } else { println("SUCCESS: UpdateQualityProfiles ${lang} > ${projectName} > ${groupName}" ) return true } } def SonarJava(projectName, groupName ){ 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=./demo/src \ -Dsonar.sourceEncoding=UTF-8 \ -Dsonar.java.binaries=./demo/target/classes \ -Dsonar.java.test.binaries=./demo/target/test-classes \ -Dsonar.java.surefire.report=./demo/target/surefire-reports """ } } def SonarWeb(projectName, groupName ){ 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=src \ -Dsonar.sourceEncoding=UTF-8 """ } } //Main def CodeSonar(type, projectName, groupName){ if (SearchProject(projectName)){ println("${projectName} exists....") } else { // 项目不存在 println("${projectName} not found....") //创建项目 CreateProject(projectName) } //质量配置 profileMap = ["maven": "java", "npm": "js"] UpdateQualityProfiles(profileMap[type], projectName, groupName) switch(type){ case "maven": SonarJava(projectName, groupName) break; case "gradle": SonarJava(projectName, groupName) break; case "npm": SonarWeb(projectName, groupName) break; default: println("No such tools ... [maven/ant/gradle/npm/yarn/go]") break } }
UnitTest.groovy
[root@jeekins devops]# cat UnitTest.groovy package hwf.devops //Maven def MavenTest(){ def buildTools = ["maven": "/data/apache-maven-3.8.3"] sh """ ${buildTools["maven"]}/bin/mvn test -f demo/pom.xml -s settings.xml """ } //Gradle def GradleTest(){ def buildTools = ["gradle": "/data/gradle-7.2"] sh """ ${buildTools["gradle"]}/bin/gradle test junit 'build/test-results/test/*.xml' """ } //Ant //def AntBuild(configPath="./build.xml"){ // sh "ant -f ${configPath}" //} //Golang //def GoTest(){ //sh " go test" //} //Npm def NpmTest(){ def buildTools = ["npm": "/data/node-v14.18.0-linux-x64" ] sh """ export PATH=\$PATH:${buildTools["npm"]}/bin ${buildTools["npm"]}/bin/npm test" """ } //Yarn //def YarnTest(){ // sh "yarn test " //} //Main def CodeTest(type){ switch(type){ case "maven": MavenTest() break; case "gradle": GradleTest() break; default: println("No such tools ... [maven/ant/gradle/npm/yarn/go]") break } }
自动构建后别忘记手动创建代码质量配置,在流水线任务里查看是否使用对应的质量库
继续阅读

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