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 的相关配置
需要注意的是 sonar.jdbc.url 中指定要连接的数据库,比如上图中是 sonar ,这个一定要提前创建。Sonarqube 虽然在启动时会自动生成业务表,但并不能自动创建库,切记!
1.6、指定 JDK 运行环境
vim /home/sonar/sonarqube-7.8/conf/wrapper.conf,打开配置文件,在文件最开头就可以找到 wrapper.java.command ,将当前系统 JDK 运行环境中的 java 命令的绝对地址填入
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 环境下的启动文件
找到 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
1.11、配置 Sonarqube 访问地址
vim /home/sonar/sonarqube-7.8/conf/sonar.properties 打开配置文件,直接搜索 sonar.web.host 找到该区域
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 启动
初始用户 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.log 和 web.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
2.1.3、在 Jenkins 上配置 Sonar TOKEN
在 Jenkins 上,打开 Credentials,添加一个 Global 的 Credential,选择 Credential 类型为 Secret text。 输入Secret 为上面生成的 SonarQube token,例如上面的生成的 TOKEN, 输入一个有意义的描述,ID可以自动产生。
2.1.4、在 Jenkins 上安装 Sonar 插件
在 Jenkins上 安装 SonarScanner 插件
2.1.5、在 Jenkins 上配置 SonarQube server
位置:系统管理/系统配置 Name:填写一个便于记忆的名称 Server URL:填写sonarQube的服务器地址 Server authentication token:选择刚才在授权凭证建立的token
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、下载插件
根据 Sonar 版本,在上面链接中下载对应版本的插件
将插件放在 /home/sonar/sonarqube-7.8/extensions/plugins 目录下,重启 soanrqube 即可