前言

我们上一章在Kubernetes中部署了Sonarqube平台:
https://blog.csdn.net/qq_44930876/article/details/128143647
接下来就与jenkins进行集成并开始扫描代码



一、jenkins关于"SonarQube"的配置

1.jenkins下载"SonarQube Scanner"扫描插件

【系统管理】➡【插件管理】➡【可选插件】
我这里已经下载过了,所以在"可选"这里没有,会在"已安装"处显示
在这里插入图片描述
在这里插入图片描述

2.配置sonarqube服务器信息

【系统管理】➡【系统配置Configure System】➡【SonarQube servers】
在这里插入图片描述

3.配置构建时下载的SonarQube Scanner扫描工具

【系统管理】➡【全局工具配置】➡【SonarQube Scanner】
在这里插入图片描述



二、扫描后端java项目

1.sonarqube创建项目并生成项目令牌

我们这里选择手工创建项目
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


创建令牌"Jenkins_SonarQube_Secret"
在这里插入图片描述


"7231ab346d6bf1875e7a6da5353a872aab25afa0"就是我们生成的令牌!!然后点击继续
在这里插入图片描述
在这里插入图片描述

mvn sonar:sonar \
  -Dsonar.projectKey=test-sonarqube \ #这里代表的是项目的名称,具体我们可以改成自己的,下面我也会改
  -Dsonar.host.url=http://internal.sonarqube.com \
  -Dsonar.login=7231ab346d6bf1875e7a6da5353a872aab25afa0

2.Jenkins后端java job中添加SonarQube代码扫描步骤

定义变量
在这里插入图片描述
添加代码检测的步骤
在这里插入图片描述
完整pipeline如下:

pipeline {
        agent any
        tools{
            maven 'mvn-3.6.3'
        }
        
        //全局变量
        environment { 
            //Harbor仓库地址以及以及镜像所在Harbor项目
         Harbor_Registry_URL= 'xxxx'
         Harbor_Registry_Cert= 'xxxx'
         Fat_Harbor_Registry_Project= 'xxxx'
         Pro_Harbor_Registry_Project= 'xxxx'
         
         
            //gitee代码仓库地址以及项目名称
         Gitee_Registry_URL= 'xxxx'
         Gitee_Code_Project= 'gotone-dw-api'
         
         //-SonqrQube信息
         SonarQube_URL= 'http://internal.sonarqube.com'
         SonarQube_Secret= '7231ab346d6bf1875e7a6da5353a872aab25afa0'
         
           //项目所在kubernetes命名空间(环境)
         Kubernetes_Project_Namespace_fat= 'xxx'  
         
        }
    parameters {
      gitParameter branch: '', branchFilter: 'origin/(.*)', defaultValue: 'master', description: '选择拉取代码的分支', name: 'Branch', quickFilterEnabled: false, selectedValue: 'NONE', sortMode: 'NONE', tagFilter: '*', type: 'GitParameterDefinition'
      booleanParam  description: '是否进行代码质量检测;', name: 'IS_CODE_DETECTION'
      booleanParam  description: '是否部署到fat环境;', name: 'IS_DEPLOY_FAT'
      booleanParam  description: '是否部署到fat1环境;', name: 'IS_DEPLOY_FAT1'
      booleanParam description: '是否将本次构建镜像推送到pro线上仓库;', name: 'Push_Image_To_Pro_Registry'
      choice(name:'Replicase', choices:'1\n3\n5', description:'请选择副本数(如果对此参数不清楚的话,默认即可);' )
    }

    stages {
        stage('拉取代码') {
            steps {
                xxxx
            }
        }
        
        stage('质量检测') {
            when { expression { return params.IS_CODE_DETECTION } }
            steps {
                withSonarQubeEnv('SonarQube') {
                sh """
                  mvn  sonar:sonar \
                  -Dsonar.projectKey=${Gitee_Code_Project} \
                  -Dsonar.host.url=${SonarQube_URL} \
                  -Dsonar.login=${SonarQube_Secret}
                """
                }
            }
        }
		
        stage('代码编译') {
            steps {
                sh """
                   mvn  xxxx这里是正常编译代码的步骤
                   """
            }
        }
        stage('构建并上传到测试仓库') {
            steps {
                  xxxx
                  xxxx
            }
        }
        
        //-部署到fat环境
        stage('部署到测试环境') {
            when { expression { return params.IS_DEPLOY_FAT } }
            steps {
                xxx
            }
        }
        
        stage('将本次构建的镜像传到pro仓库') {
              when { expression { return params.Push_Image_To_Pro_Registry } }
            steps {
                xxx    
            }
        }
        
        stage('清除本地镜像') {
            steps {
                xxx
            }
        }
   }
}

3.Jenkins构建后会在sonarqube内生成扫描报告

在这里插入图片描述
在这里插入图片描述

进入到SonarQube内查看生成扫描报告
在这里插入图片描述


点进去可以查看具体的扫描信息
在这里插入图片描述
在这里插入图片描述



三、扫描前端vue项目

1.sonarqube创建项目并生成项目令牌

这里步骤大致和上面后端的一致,接着使用上面后端项目的令牌即可
主要是这一步,需要选择前端构建的技术,这里选择js就行,然后需要选择操作系统,接着跟后端步骤一样将下述的代码加入到我们的前端构建步骤里就行了
在这里插入图片描述

sonar-scanner \
  -Dsonar.projectKey=test-sonarqube \ #这里代表的是项目的名称,具体我们可以改成自己的,下面我也会改
  -Dsonar.sources=. \
  -Dsonar.host.url=http://internal.sonarqube.com \
  -Dsonar.login=7231ab346d6bf1875e7a6da5353a872aab25afa0

2.Jenkins前端vue job中添加SonarQube代码扫描步骤

定义变量
在这里插入图片描述
添加代码检测的步骤
在这里插入图片描述

完整pipeline如下:

pipeline {
        agent any
        tools{
            nodejs 'node-14.19.2'
        }
        
        //全局变量
        environment { 
            //Harbor仓库地址以及以及镜像所在Harbor项目
         Harbor_Registry_URL= 'xxxx'
         Harbor_Registry_Cert= 'HQTxxxx'
         Fat_Harbor_Registry_Project= 'xxxx'   
         Pro_Harbor_Registry_Project= 'xxxx'
         
            //gitee代码仓库地址以及项目名称
         Gitee_Registry_URL= 'xxxxx'
         Gitee_Code_Project= 'gotone-admin'
         
         //-SonqrQube信息
         SonarQube_URL= 'http://internal.sonarqube.com'
         SonarQube_Secret= '7231ab346d6bf1875e7a6da5353a872aab25afa0'
         
           //项目所在kubernetes命名空间(环境)
         Kubernetes_Project_Namespace_fat= 'xxx'  //本地环境
         
        }
    parameters {
      gitParameter branch: '', branchFilter: 'origin/(.*)', defaultValue: 'master', description: '选择拉取代码的分支', name: 'Branch', quickFilterEnabled: false, selectedValue: 'NONE', sortMode: 'NONE', tagFilter: '*', type: 'GitParameterDefinition'
      booleanParam  description: '是否进行代码质量检测;', name: 'IS_CODE_DETECTION'
      choice(choices: ['fat1','fat','prod'], description: '请选择需要部署的环境', name: 'deploy_env')
      booleanParam  description: '是否部署到fat环境;', name: 'IS_DEPLOY_FAT'
      booleanParam  description: '是否部署到fat1环境;', name: 'IS_DEPLOY_FAT1'
      booleanParam description: '是否将本次构建镜像推送到pro线上仓库;', name: 'Push_Image_To_Pro_Registry'
      choice(name:'Replicase', choices:'1\n3\n5', description:'请选择副本数(如果对此参数不清楚的话,默认即可);' )
      
    }

    stages {
        stage('拉取代码') {
            steps {
                xxxx
            }
        }
        
        stage('git merge') {
            steps {
              xxxx
            }
        }
        
        
        stage('init vars '){
            agent any
            steps {
                xxxx
            }
        }
        
        stage('质量检测') {
            steps {
                script{
                    scannerHome = tool 'sonar-scanner'
                }
                    withSonarQubeEnv('SonarQube') {
                        sh"""
                          ${scannerHome}/bin/sonar-scanner \
                          -Dsonar.projectKey=${Gitee_Code_Project} \
                          -Dsonar.sources=. \
                          -Dsonar.host.url=${SonarQube_URL} \
                          -Dsonar.login=${SonarQube_Secret}
                        """
                }
            }
        }
        
        stage('代码编译') {
            steps {
                sh """
                npm xxxx #正常的npm编译步骤
                """
                }
            }
        
                 
        stage('构建并上传到测试仓库') {
            steps {
               xxxx
            }
        }
        
        //-部署到fat环境
        stage('部署到测试环境') {
            when { expression { return params.IS_DEPLOY_FAT } }
            steps {
                xxxx
            }
        }
		
        stage('将本次构建的镜像传到pro仓库') {
              when { expression { return params.Push_Image_To_Pro_Registry } }
            steps {
                xxxx   
            }
        }
        
        stage('清除本地镜像') {
            steps {
                xxxx  
            }
        }
   }
}

3.Jenkins构建后会在sonarqube内生成扫描报告

在这里插入图片描述
在这里插入图片描述


进入到SonarQube内查看生成扫描报告
在这里插入图片描述


点进去可以查看具体的扫描信息
在这里插入图片描述
在这里插入图片描述

以上就是jenkins集成Sonqube并扫描前后端代码的方法;


遇到的问题:

这个问题已经添加到部署SonarQube的帖子里面了
错误信息如下:

[INFO] Analysis report generated in 180ms, dir size=4.4 MB
[INFO] Analysis report compressed in 1238ms, zip size=2.4 MB
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  01:29 min
[INFO] Finished at: 2022-11-30T16:57:48+08:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.sonarsource.scanner.maven:sonar-maven-plugin:3.9.1.2184:sonar (default-cli) on project gotone-settlement-api: Failed to upload report - HTTP code 413: <html>
[ERROR] <head><title>413 Request Entity Too Large</title></head>
[ERROR] <body>
[ERROR] <center><h1>413 Request Entity Too Large</h1></center>
[ERROR] -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

在这里插入图片描述
报错的原因是上传的扫描报告数据太大了,这个问题经常在SonarQube使用了代理的情况下会出现,例如nginx代理,再比如我这里,我的Sonar是在kubernetes里部署的,使用了nginx-ingress代理访问,而nginx中的client_max_body_size的默认值为1m,这个参数的作用是设置最大允许客户端请求体的大小,如果超过了这个值,客户端就会收到413状态码,就是请求的实体太大导致的;



解决方式:

kubernetes中给ingress添加注解annotations::
nginx.ingress.kubernetes.io/proxy-body-size: "1024m"

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  namespace: sonar
  name: sonarqube
  annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: "1024m"

具体可参考:
https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/
在这里插入图片描述

使用原生nginx代理解决方式:

http{
	client_max_body_size 1024m;
} 
Logo

前往低代码交流专区

更多推荐