我们上一章在Kubernetes中部署了Sonarqube平台:
https://blog.csdn.net/qq_44930876/article/details/128143647
接下来就与jenkins进行集成并开始扫描代码
【系统管理】➡【插件管理】➡【可选插件】
我这里已经下载过了,所以在"可选"这里没有,会在"已安装"处显示
【系统管理】➡【系统配置Configure System】➡【SonarQube servers】
【系统管理】➡【全局工具配置】➡【SonarQube Scanner】
我们这里选择手工创建项目
创建令牌"Jenkins_SonarQube_Secret"
"7231ab346d6bf1875e7a6da5353a872aab25afa0"就是我们生成的令牌!!然后点击继续
mvn sonar:sonar \
-Dsonar.projectKey=test-sonarqube \ #这里代表的是项目的名称,具体我们可以改成自己的,下面我也会改
-Dsonar.host.url=http://internal.sonarqube.com \
-Dsonar.login=7231ab346d6bf1875e7a6da5353a872aab25afa0
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
}
}
}
}
进入到SonarQube内查看生成扫描报告
点进去可以查看具体的扫描信息
这里步骤大致和上面后端的一致,接着使用上面后端项目的令牌即可
主要是这一步,需要选择前端构建的技术,这里选择js就行,然后需要选择操作系统,接着跟后端步骤一样将下述的代码加入到我们的前端构建步骤里就行了
sonar-scanner \
-Dsonar.projectKey=test-sonarqube \ #这里代表的是项目的名称,具体我们可以改成自己的,下面我也会改
-Dsonar.sources=. \
-Dsonar.host.url=http://internal.sonarqube.com \
-Dsonar.login=7231ab346d6bf1875e7a6da5353a872aab25afa0
完整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
}
}
}
}
进入到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: >
[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使用了代理的情况下会出现,例如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;
}