Jenkins+Sonar质量门禁【实践篇pipeline版】

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规则一直无法生效,后续再研究下

最后感谢一系列给我帮助的文档(排名不分先后,哈哈哈)

原文地址:https://www.cnblogs.com/windysai/p/15743539.html