SonarQube 9.x与Jenkins进行集成并扫描后端java以及前端vue代码;

Posted 不知名运维:

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SonarQube 9.x与Jenkins进行集成并扫描后端java以及前端vue代码;相关的知识,希望对你有一定的参考价值。

文章目录


前言

我们上一章在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;
 

本地安装SonarQube之二——安装SonarQube

1. 下载软件

  • 安装 SonarQube   https://www.sonarqube.org/downloads/
  • 安装SonarQube Scanners       https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner

以上是关于SonarQube 9.x与Jenkins进行集成并扫描后端java以及前端vue代码;的主要内容,如果未能解决你的问题,请参考以下文章

jenkins与SonarQube集成

持续集成Jenkins+sonarqube部署教程

持续集成Jenkins+sonarqube部署教程

jenkins集成sonarqube代码审核

jenkins集成sonarqube代码审核

Jenkins集成Sonarqube