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

文章目录

  • 前言
  • 一、jenkins关于"SonarQube"的配置
    • 1.jenkins下载"SonarQube Scanner"扫描插件
    • 2.配置sonarqube服务器信息
    • 3.配置构建时下载的SonarQube Scanner扫描工具
  • 二、扫描后端java项目
    • 1.sonarqube创建项目并生成项目令牌
    • 2.Jenkins后端java job中添加SonarQube代码扫描步骤
    • 3.Jenkins构建后会在sonarqube内生成扫描报告
  • 三、扫描前端vue项目
    • 1.sonarqube创建项目并生成项目令牌
    • 2.Jenkins前端vue job中添加SonarQube代码扫描步骤
    • 3.Jenkins构建后会在sonarqube内生成扫描报告
  • 遇到的问题:
  • 解决方式:


前言

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



一、jenkins关于"SonarQube"的配置

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

【系统管理】➡【插件管理】➡【可选插件】
我这里已经下载过了,所以在"可选"这里没有,会在"已安装"处显示
SonarQube 9.x与Jenkins进行集成并扫描后端java以及前端vue代码;_第1张图片
SonarQube 9.x与Jenkins进行集成并扫描后端java以及前端vue代码;_第2张图片

2.配置sonarqube服务器信息

【系统管理】➡【系统配置Configure System】➡【SonarQube servers】
SonarQube 9.x与Jenkins进行集成并扫描后端java以及前端vue代码;_第3张图片

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

【系统管理】➡【全局工具配置】➡【SonarQube Scanner】
SonarQube 9.x与Jenkins进行集成并扫描后端java以及前端vue代码;_第4张图片



二、扫描后端java项目

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

我们这里选择手工创建项目
SonarQube 9.x与Jenkins进行集成并扫描后端java以及前端vue代码;_第5张图片
SonarQube 9.x与Jenkins进行集成并扫描后端java以及前端vue代码;_第6张图片
SonarQube 9.x与Jenkins进行集成并扫描后端java以及前端vue代码;_第7张图片


创建令牌"Jenkins_SonarQube_Secret"
SonarQube 9.x与Jenkins进行集成并扫描后端java以及前端vue代码;_第8张图片


"7231ab346d6bf1875e7a6da5353a872aab25afa0"就是我们生成的令牌!!然后点击继续
SonarQube 9.x与Jenkins进行集成并扫描后端java以及前端vue代码;_第9张图片
SonarQube 9.x与Jenkins进行集成并扫描后端java以及前端vue代码;_第10张图片

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

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

定义变量
SonarQube 9.x与Jenkins进行集成并扫描后端java以及前端vue代码;_第11张图片
添加代码检测的步骤
SonarQube 9.x与Jenkins进行集成并扫描后端java以及前端vue代码;_第12张图片
完整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 9.x与Jenkins进行集成并扫描后端java以及前端vue代码;_第13张图片
SonarQube 9.x与Jenkins进行集成并扫描后端java以及前端vue代码;_第14张图片

进入到SonarQube内查看生成扫描报告
SonarQube 9.x与Jenkins进行集成并扫描后端java以及前端vue代码;_第15张图片


点进去可以查看具体的扫描信息
SonarQube 9.x与Jenkins进行集成并扫描后端java以及前端vue代码;_第16张图片
SonarQube 9.x与Jenkins进行集成并扫描后端java以及前端vue代码;_第17张图片



三、扫描前端vue项目

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

这里步骤大致和上面后端的一致,接着使用上面后端项目的令牌即可
主要是这一步,需要选择前端构建的技术,这里选择js就行,然后需要选择操作系统,接着跟后端步骤一样将下述的代码加入到我们的前端构建步骤里就行了
SonarQube 9.x与Jenkins进行集成并扫描后端java以及前端vue代码;_第18张图片

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

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

定义变量
SonarQube 9.x与Jenkins进行集成并扫描后端java以及前端vue代码;_第19张图片
添加代码检测的步骤
SonarQube 9.x与Jenkins进行集成并扫描后端java以及前端vue代码;_第20张图片

完整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 9.x与Jenkins进行集成并扫描后端java以及前端vue代码;_第21张图片
SonarQube 9.x与Jenkins进行集成并扫描后端java以及前端vue代码;_第22张图片


进入到SonarQube内查看生成扫描报告
SonarQube 9.x与Jenkins进行集成并扫描后端java以及前端vue代码;_第23张图片


点进去可以查看具体的扫描信息
SonarQube 9.x与Jenkins进行集成并扫描后端java以及前端vue代码;_第24张图片
SonarQube 9.x与Jenkins进行集成并扫描后端java以及前端vue代码;_第25张图片

以上就是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: >
[ERROR] >>413 Request Entity Too Large>>
[ERROR] >
[ERROR] >>413 Request Entity Too Large>>
[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 9.x与Jenkins进行集成并扫描后端java以及前端vue代码;_第26张图片
报错的原因是上传的扫描报告数据太大了,这个问题经常在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/
SonarQube 9.x与Jenkins进行集成并扫描后端java以及前端vue代码;_第27张图片

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

http{
	client_max_body_size 1024m;
} 

你可能感兴趣的:(SonarQube,代码检测平台,jenkins,前端,java,运维,kubernetes)