Jenkins+Sonar质量门禁【实践篇-pipeline版】
一、目标
效果是要实现文章:Jenkins+Sonar质量门禁实践【https://blog.csdn.net/jiangjunsss/article/details/119918932】里面的接入sonar质量门禁,当扫描不满足制定的质量阀时就不进行后面的步骤。
文章提到,有两种方法使得jenkins新建的job使用sonar
-
a. 直接将sonar-project.properties配置内容写到 Analysis properties 中
-
b. 将配置好的sonar-project.properties文件放置在代码目录中,在 Path to project properties 配置相应的文件名
明显用pipeline方式去实验质量门禁,需要用第 b 种方法,因为你会发现,新建流水线是没地方配置Analysis properties 的,而且pipeline代码里面需要用到waitForQualityGate() 来获取质量门禁的状态,也没地方让你配置(参数说明,请参考官网jenkins插件:https://www.jenkins.io/doc/pipeline/steps/sonar/)
先上效果图:
前提:把上一篇文章的helloworld项目放到我自己的gitee里(因为某俊的helloworld我添加不了文件到git上),新建一个sonar-project.properties文件,跟pom.xml同级目录。在sonar服务端的质量阈中设置质量门禁,并配置好jenkins回调地址
二、注意点
1、git项目上,pom.xml 同级目录上,要放一个 sonar-project.properties
内容如下:
sonar.login=admin sonar.password=admin # 项目key 保证唯一 sonar.projectKey=ljy # 项目名字 sonar.projectName=helloworld-ljy sonar.projectVersion=1.0 sonar.sources=. sonar.java.binaries=target/classes
然后把参考文章中的流水线代码拷过来就开始各种报错了,其中一个是找不到 target/classes 目录
上篇的maven篇文章,还记得截图上的maven build么,整合到jenkins发布,是需要加上来的。
完整pipeline代码先贴上,我再解释:
pipeline { agent any environment { GIT_URL="https://gitee.com/windysai/helloworld.git" SCANNER_HOME = tool 'SonarQubeScanner' } stages { stage("拉取代码") { steps{ echo "git pull ${BRANCH} from ${GIT_URL}" git branch: "${BRANCH}", url: "${GIT_URL}" } }
## 要加上去 stage('mvn compile'){ steps { echo "compile code" sh "/usr/local/maven/bin/mvn clean install -e -DskipTests=true -Ptest -f pom.xml" } } stage('静态代码静态扫描'){ steps { withSonarQubeEnv('MyScanner') { sh '''$SCANNER_HOME/bin/sonar-scanner \ -Dsonar.login=admin \ -Dsonar.password=admin ''' } } } stage('检查结果分析') { steps { script{ timeout(5) { def qg=waitForQualityGate() echo "结果状态: ${qg.status}" if (qg.status!='OK') error '未达到代码门禁要求 !' } } } } } }
里面引用到的sonar配置,这篇文章的对应关系,写的比较详细:https://igorski.co/sonarqube-scans-using-jenkins-declarative-pipelines/
测试的pipeline代码中,报错最多是“ERROR: SonarQube installation defined in this job (sonar_scanner) does not match any configured installation. Number of installations that can be configured: 1.”。原因是sonar scanner工具和sonar server 没分清楚!一个是jenkins里面的插件工具,用来进行代码扫描的的,一个是要连接的sonar服务端,用于把扫描的结果详情存起来的。
看jenkins的控制台输出会更加理解:
scanner 在全局工具里配置的,名字:SonarQubeScanner, 所以pipeline开始有个环境变量声明就是它的名字。
MyScanner就是我配置的sonar server
二、遇到的其他一些问题
1、网上找到的配置文档很多都把jenkins回调接口写成:http://jenkins所在服务器ip:jenkins监控端口/jenkins/sonarqube-webhook/
但对于docker容器跑的jenkins,实际上是:http://jenkins所在服务器ip:jenkins监控端口/sonarqube-webhook/。
一个简单测试是在浏览器打开回调接口,应该会出现下面的返回截图。如果没有配对,waitForQualityGate() 获取的返回结果一直会是:pending状态,直到超时退出。
2、参考文档上的 timeout(5) ,注意括号应该是英文形式;
3、公司的项目后来也测试成功了,需要在maven配置文件:settings.xml 添加公司nexus仓库地址,因为有些包就是从里面拉的,默认的仓库会因为拉不到依赖包报错。
还有一个未解的问题,在sonarqube设置自己新建的质量阈规则时,项目还是沿用默认、内置的规则:Sonar Way,我的testljy规则一直无法生效,后续再研究下
最后感谢一系列给我帮助的文档(排名不分先后,哈哈哈)