Jenkins集成Sonar

456 阅读4分钟

Jenkins集成Sonar

1、Sonar安装

1.1、前置环境

MySQL 的依赖会在Sonar7.9版本被弃用,不过需要注意的是 Mysql 对版本有要求,只能支持Sonar 5.6 ~ 7.9 。 所以如果想在 Sonarqube 中使用 MySQL ,那么 Sonarqube 的版本最高只能是 7.8 ,MySQL 最好直接使用 5.7

部署版本:

Mysql-5.7、Sonar-7.8、CentOS-7.6、JDK-8

1.2、下载Sonar安装包

binaries.sonarsource.com/Distributio…

1.3、创建用户

useradd sonar
passwd sonar
chown -R sonar:sonar /home/sonarsonarqube-7.8

1.4、解压压缩包

将下载好的安装包上传到服务器,使用 unzip sonarqube-7.8.zip 即可,我这里是放在 /home/sonar

目录,后续操作都是以该目录为基准

1.5、配置数据库连接

vim /home/sonar/sonarqube-7.8/conf/sonar.properties,打开 Sonarqube 的核心配置文件,在文件开头就可以找到 MySQL 的相关配置

1.png

需要注意的是 sonar.jdbc.url 中指定要连接的数据库,比如上图中是 sonar ,这个一定要提前创建。Sonarqube 虽然在启动时会自动生成业务表,但并不能自动创建库,切记!

1.6、指定 JDK 运行环境

vim /home/sonar/sonarqube-7.8/conf/wrapper.conf,打开配置文件,在文件最开头就可以找到 wrapper.java.command ,将当前系统 JDK 运行环境中的 java 命令的绝对地址填入

2.png

1.7、创建用户用于启动 Sonar

因为 Sonarqube 依赖 Elasticsearch ,而后者不能使用 root 用户启动,所以还需要创建一个专门用于启动 Sonarqube 的用户,见1.3

但其实 Sonarqube 在启动时,不用专门切换到该用户再启动,只需要在 Sonarqube 的启动文件中将执行用户指定为该用户即可。使用 vim /home/sonar/sonarqube-7.8/bin/linux-x86-64/sonar.sh 打开 Sonarqube 在 Linux 环境下的启动文件

3.png

找到 RUN_AS_USER ,将刚才创建好的用户填入即可。

1.8、配置目录的执行权限

为防止 Sonarqube 相关目录没有执行权限,这里直接执行 chmod -R 764 /home/sonar/sonarqube7.8 为整个文件夹更改权限。

1.9、配置系统参数

切换到 root 用户

vim /etc/sysctl.conf 打开配置文件,在末尾添加:

vm.max_map_count=262144
fs.file-max=65536

保存并退出后,执行 sysctl -p 使配置生效

vim /etc/security/limits.conf 打开配置文件,在末尾添加:

sonar soft nofile 65536
sonar hard nofile 65536
​
root soft nofile 65536
root hard nofile 65536

1.10、Elasticsearch 相关配置

切回 sonar 用户

vim /home/sonar/sonarqube-7.8/conf/sonar.properties 打开配置文件,找到 sonar.search.javaAdditionalOpts 选项,在后面填入 -Dbootstrap.system_call_filter=false

4_1.png

1.11、配置 Sonarqube 访问地址

vim /home/sonar/sonarqube-7.8/conf/sonar.properties 打开配置文件,直接搜索 sonar.web.host 找到该区域

5.png

host:ip

port:端口

context:根请求

在浏览器输入 http://10.100.1.xxx:9000 即可访问 Sonar 首页

1.12、启动 Sonar

直接执行 /home/sonar/sonarqube-7.8/bin/linux-x86-64/sonar.sh console 就可以启动 Sonar,并且可以直观的看到日志。也可以使用 ./sonar.sh start 启动

6.png

初始用户 admin/admin

1.13、查看日志

Sonarqube 的日志目录位于 /home/sonar/sonarqube-7.8/logs 目录,分别有:

  • access.log 访问权限相关日志
  • ce.log 不知道啥日志,应该没用
  • sonar.log 主体日志,使用 console 命令启动输出的日志来自该文件
  • es.log 依赖的 Elasticsearch 启动时输出的日志
  • web.log 主体 Web 项目输出的日志 在配置 Sonarqube 时,集中关注 es.logweb.log 即可

2、Jenkins集成Sonar

2.1、SonarQube配置准备

2.1.1、打开 TOKEN 授权开关

使用Admin账号登录Sonar,打开Server authentication token开关,Administration/Configuration/Security 菜单位置

2.1.2、获取一个 TOKEN

登录后右上角点击用户名称,选择我的账号,进入个人账号设置

选择安全页,在Generate Tokens中输入一个名称,如:xxx,然后点击Generate,生成一个token

7.png

2.1.3、在 Jenkins 上配置 Sonar TOKEN

在 Jenkins 上,打开 Credentials,添加一个 Global 的 Credential,选择 Credential 类型为 Secret text。 输入Secret 为上面生成的 SonarQube token,例如上面的生成的 TOKEN, 输入一个有意义的描述,ID可以自动产生。

8.png

2.1.4、在 Jenkins 上安装 Sonar 插件

在 Jenkins上 安装 SonarScanner 插件

2.1.5、在 Jenkins 上配置 SonarQube server

位置:系统管理/系统配置 Name:填写一个便于记忆的名称 Server URL:填写sonarQube的服务器地址 Server authentication token:选择刚才在授权凭证建立的token

9.png

2.2、在项目中配置 Sonar

2.2.1、在 pom.xml 中添加插件
<plugin>
  <groupId>org.jacoco</groupId>
  <artifactId>jacoco-maven-plugin</artifactId>
  <version>0.8.7</version>
  <executions>
    <execution>
      <id>prepare-agent</id>
      <goals>
        <goal>prepare-agent</goal>
      </goals>
    </execution>
    <execution>
      <id>report</id>
      <goals>
        <goal>report</goal>
      </goals>
      <configuration>
        <formats>
          <format>XML</format>
        </formats>
      </configuration>
    </execution>
  </executions>
</plugin><plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.22.2</version>
</plugin><plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <configuration>
    <source>8</source>
    <target>8</target>
  </configuration>
</plugin>
2.2.2、在 JenkinsFile 中添加 Sonar stage
env.projectname = env.JOB_NAME.split('/')[0]
stage('jacoco') {
            steps {
                echo "starting unitTest......"
                //注入jacoco插件配置,clean test执行单元测试代码. All tests should pass.
                sh "/opt/apache-maven-3.6.0/bin/mvn clean install -Dmaven.test.failure.ignore=true"//测试类报错时继续执行
            }
        }
​
stage('sonar') {
            steps {
                script{
                    echo 'This is a sonar step'
                    def sonarqubeScannerHome = tool name: 'SonarQubeScanner2.11'
                    echo sonarqubeScannerHome
                    withSonarQubeEnv('sonar_server') {
                        sh "${sonarqubeScannerHome}/bin/sonar-scanner -X "+
                                "-Dsonar.host.url=${SONAR_HOST_URL} " + //sonarhttp地址,可动态获取,无需配置
                                "-Dsonar.language=java " +
                                "-Dsonar.projectKey=${env.projectname}  " + //项目名称,需要存在环境变量
                                "-Dsonar.projectVersion=${env.BUILD_NUMBER} " +
                                "-Dsonar.core.codeCoveragePlugin=jacoco "+ //使用jacoco插件
                                "-Dsonar.java.binaries=target/classes " +
                                "-Dsonar.java.test.binaries=target/test-classes " +
                                "-Dsonar.junit.reportPaths=target/surefire-reports " +
                                "-Dsonar.sources=src/main/java " +
                                "-Dsonar.tests=src/test/java " +
                                "-Dsonar.coverage.exclusions=**/anno/**/*,**/conf/**/*,**/fegin/**/*,**/exception/**/*,**/model/**/*,**/enums/**/*" // 排除不需要单测覆盖的类
                    }
                }
            }
        }

2.3、在Sonar中添加分支测试覆盖率报告

2.3.1、下载插件

github.com/mc1arke/son…

根据 Sonar 版本,在上面链接中下载对应版本的插件

将插件放在 /home/sonar/sonarqube-7.8/extensions/plugins 目录下,重启 soanrqube 即可