zoukankan      html  css  js  c++  java
  • 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规则一直无法生效,后续再研究下

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

  • 相关阅读:
    认识弹性盒子
    管理Linux服务器的用户和组(续篇)
    管理Linux服务器的用户和组
    centos7 mysql数据库安装和配置
    熟练使用Linux进程管理类命令
    熟练使用Linux系统信息类命令
    Linux操作系统-基本命令(二)
    Linux操作系统-基本命令(一)
    api接口统一封装
    10分钟,让你彻底明白Promise原理
  • 原文地址:https://www.cnblogs.com/windysai/p/15743539.html
Copyright © 2011-2022 走看看