Jenkins+sonarqube实现代码自动扫描

1. 整体流程

上传代码到git仓库—>触发Jenkins构建代码—>编译、打包、测试—>代码扫描—>发布
代码扫描—>提交—>…

2. sonarqube的配置

1)设置账户强制登陆

设置之后访问首页不再直接出现首页,登录后才可以看到首页

未设置之前如下图:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
设置完成后,登陆9000端口,页面如下
在这里插入图片描述

2)项目的私有性

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

3)权限管理

先创建用户
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
创建群组:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
向组内加入成员test01:

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

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

以上的意思是说 test1组内有test01用户,这个组对于test1开头的项目有权限

创建新的项目来测试一下

在这里插入图片描述

加入群组

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

我们退出admin用户,用test01用户登陆,可以看到如下页面,cloud可以看到是因为它是之前的
在这里插入图片描述

4)与Jenkins协同合作的准备

把原来的权限模板改一下,把管理员也加进去,然后对所有的项目应用权限模板
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. jenkins端操作

1)Jenkins上配置scanner和groovy

[root@localhost ~]# unzip sonar-scanner-cli-4.0.0.1744-linux.zip 
[root@localhost ~]# mv sonar-scanner-4.0.0.1744-linux/ /usr/local/sonar-scanner
[root@localhost ~]# ln -s /usr/local/sonar-scanner/bin/sonar-scanner /usr/bin
[root@localhost ~]# unzip apache-groovy-sdk-3.0.0-beta-1.zip 
[root@localhost ~]# mv groovy-3.0.0-beta-1/ /usr/local/groovy
[root@localhost ~]# ln -s /usr/local/groovy/bin/groovy /usr/bin
[root@localhost ~]# vim /etc/profile #尾部添加
export SONAR_HOME=/usr/local/sonar-scanner
export GROOVY_HOME=/usr/local/groovy
export PATH=$PATH:$SONAR_HOME/bin:$GROOVY_HOME/bin
[root@localhost ~]# source /etc/profile

防止找不到mvn命令,做一个软链接
[root@localhost ~]# ln -s /usr/local/maven/bin/mvn /usr/bin/

2) gitlab上创建两个项目,一个放Jenkinsfile 另一个放项目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
先少写一点,提交一下,之后再慢慢完善
在这里插入图片描述
在这里插入图片描述

2)新建Jenkins流水线任务

在这里插入图片描述
选择参数化构建
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
仓库地址是刚才创建的Jenkinsfile项目的网址
账号和密码是gitlab的root用户的账号和密码

在这里插入图片描述
这个文件名字是刚才gitlab项目中jenkinsfile文件的名字

在这里插入图片描述
点击项目主页的“参数化构建” 可以看到右侧的红色框框的参数

3)编写jenkinsfile文件

#!/usr/bin/groovy

node("master"){
    //checkout
    checkout([$class: 'GitSCM',
             branches: [[name: '*/master']], 
             doGenerateSubmoduleConfigurations: false, 
             extensions: [], submoduleCfg: [], 
             userRemoteConfigs: [[credentialsId: 'dc85759a-1cc0-461e-8ba9-383e3169e5f3', 
             url: 'http://gitlab.kgc.cn/kgc/kgcweb.git']]])
    //Build
    sh "mvn ${buildShell}"
    
    //Sonar
    sh  """
        sonar-scanner -Dsonar.projectKey=${serviceName} \
                      -Dsonar.projectName=${serviceName} \
                      -Dsonar.login=765062f69357d1b970e7dfb1b87da77ef2aa7407 \
                      -Dsonar.sources=src \
                      -Dsonar.host.url=${sonarServer}
        """
}

简单说明

checkout从流水线语法页面产生
-Dsonar.login从sonarqube的web页面产生
-Dsonar.sources=src 说的是项目的源码放在项目根目录下的src目录

在这里插入图片描述
在这里插入图片描述
sonarqube产生的秘钥765062f69357d1b970e7dfb1b87da77ef2aa7407

在这里插入图片描述

4)进行参数化构建

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

构建成功,我们可以去sonarqube平台查看代码的检测结果

在这里插入图片描述

5)流水线里归档文件

只需要修改一下jenkinsfile就行了,加入归档文件的语句

#!/usr/bin/groovy

node("master"){
    //checkout
    checkout([$class: 'GitSCM',
             branches: [[name: '*/master']], 
             doGenerateSubmoduleConfigurations: false, 
             extensions: [], submoduleCfg: [], 
             userRemoteConfigs: [[credentialsId: 'dc85759a-1cc0-461e-8ba9-383e3169e5f3', 
             url: 'http://gitlab.kgc.cn/kgc/kgcweb.git']]])
    //Build
    sh "mvn ${buildShell}"
    
    //Archive artifacts
    archiveArtifacts 'target/kgcweb.war'
    
    //Sonar
    sh  """
        sonar-scanner -Dsonar.projectKey=${serviceName} \
                      -Dsonar.projectName=${serviceName} \
                      -Dsonar.login=765062f69357d1b970e7dfb1b87da77ef2aa7407 \
                      -Dsonar.sources=src \
                      -Dsonar.host.url=${sonarServer}
        """
}

归档之后可以看到web页面直接就有归档的war包
在这里插入图片描述

归档的语句可以通过流水线语法生成器生成
在这里插入图片描述

6)加入对是否跳过某个步骤的选择

在这里插入图片描述
在这里插入图片描述
false写在前边,表示默认情况下,如果不选择参数,参数就是false
在这里插入图片描述

#!/usr/bin/groovy

String skipSonar = "${env.skipSonar}"
String skipTest = "${env.skipTest}"

node("master"){
    //checkout
    checkout([$class: 'GitSCM',
             branches: [[name: '*/master']], 
             doGenerateSubmoduleConfigurations: false, 
             extensions: [], submoduleCfg: [], 
             userRemoteConfigs: [[credentialsId: 'dc85759a-1cc0-461e-8ba9-383e3169e5f3', 
             url: 'http://gitlab.kgc.cn/kgc/kgcweb.git']]])
    //Build
    if ("${skipTest}" == "true"){
        sh "mvn ${buildShell} -Dmaven.test.skip"
    } else {
        sh "mvn ${buildShell}"
    }
    //Archive artifacts
    archiveArtifacts 'target/kgcweb.war'
    
    //Sonar
    if ("${skipSonar}" == "true"){
        echo "skip scanner step"
    } else {
        sh  """
            sonar-scanner -Dsonar.projectKey=${serviceName} \
                          -Dsonar.projectName=${serviceName} \
                          -Dsonar.login=765062f69357d1b970e7dfb1b87da77ef2aa7407 \
                          -Dsonar.sources=src \
                          -Dsonar.host.url=${sonarServer}
            """
    }
}

在这里插入图片描述

7)Maven中-DskipTests和-Dmaven.test.skip=true的区别

在使用mvn package进行编译、打包时,Maven会执行src/test/java中的测试用例,有时为了跳过测试,会使用参数-DskipTests和-Dmaven.test.skip=true,这两个参数的主要区别是:

-DskipTests,不执行测试用例,但编译测试用例类生成相应的class文件至target/test-classes下

-Dmaven.test.skip=true,不执行测试用例,也不编译测试用例类

原创文章 94 获赞 132 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_43557605/article/details/95391127
今日推荐