DevOps 生态介绍(四):Sonarqube&jacoco 与jenkins集成使用

Jacoco 简介

Jacoco 官网:https://www.jacoco.org/jacoco/trunk/index.html

Jacoco 是一个免费的java 代码覆盖率工具,今天这边文章只介绍Maven 项目使用jacoco

Jacoco 其他的配置可以参考官网文档

Jacoco 部署

前提条件:

Maven:Maven 3.0 或者更高版本

JDK: jdk1.8 或更高版本

我这边环境的版本:Maven5.14 JDK21

jacoco 不需要单独部署,只需要在项目的根pom.xml文件中增加jacoco plugin 即可

java 复制代码
            <plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>0.8.13</version>
                <executions>
                    <execution>
                        <id>prepare-agent</id>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>report</id>
                        <phase>test</phase>
                        <goals>
                            <goal>report</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

Jacoco 与Jenkins集成

在Jenkins 页面平台安装Jacoco组件

组件安装好了后,在jenkins 点击构建的项目进行配置,增加jacoco组件

按照如下配置即可

备注说明:

上述配置好了后,点击项目构建,构建最后一步就是在运行jacoco 组件的工作

jacoco.exec :构建成功后,在target目录下会生成一个jacoco.exec 的二进制文件。

jacoco.exec 的核心作用就是记录代码的执行轨迹

Jenkins 平台查看jacoco代码覆盖率

这里红框中可以看到汇总的结果数据

Coverage Report 可以看到详细信息,也可以点进去继续查看更细的

Sonarqube 简介

Sonarqube 是一个用于持续代码质量检测和代码安全扫描的平台。

Sonarqube核心作用:可以理解为 "代码质量审计平台"

Sonarqube检查哪些问题:

Bug、Vulnerability(安全漏洞)、Code Smell(代码坏味道)、Coverage(测试覆盖率)、Duplicate(重复代码)

Sonarqube 部署

环境准备:jdk21 postgresql 15.2 sonarqube-26.4.0

openjdk 21 安装部署:

bash 复制代码
#openjdk 下载链接:https://jdk.java.net/archive/ 找到jdk21版本下载即可

#将openjdk-21.0.2_linux-x64_bin.tar.gz 上传到/data/app/pats_opts/java 解压即可

tar -zxvf  openjdk-21.0.2_linux-x64_bin.tar.gz 得到jdk-21.0.2 文件夹,将jdk21配置成系统环境

vim /etc/profile

    #set jdk21 environment

    export JAVA_HOME=/data/app/pats_opts/java/jdk-21.0.2

    export JRE_HOME=/data/app/pats_opts/java/jdk-21.0.2

    export CLASS_PATH=.:$JAVA_HOME/lib:$JRE_HOME/lib

    export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

source /etc/profile

jdk 版本查看:java -version

​

postgresql 15.2:

postgresql 数据库安装步骤请参照

" PostgreSQL 单节点部署 + 原生流复制(Streaming Replication)完全指南"

在数据库中新增Sonarqube 服务使用的用户名、密码、库名

bash 复制代码
#在这里创建了user 、password、database 都是sonar,这些参数根据情况自定义即可

CREATE USER sonar WITH PASSWORD 'sonar';
CREATE DATABASE sonar TEMPLATE = template0 ENCODING 'UTF8' owner sonar;

#用户名密码登录到新增数据下面执行赋权sql
GRANT ALL PRIVILEGES ON DATABASE sonar  TO sonar ;

Sonarqube 服务部署:

下载文档:https://www.sonarqube.org/downloads/,下载社区开源版本即可

免费的话就选择社区版本, 选择下载zip 安装包并上传到sonarqube 服务器的/data/app/pats_opts目录下并解压

bash 复制代码
cd  /data/app/pats_opts  
unzip sonarqube-26.4.0.121862.zip 

#解压后即可配置sonarqube

配置Sonarqube 配置文件 及 新增Sonarqube 用户名密码

bash 复制代码
vi sonar.properties
	sonar.jdbc.username=sonar
    sonar.jdbc.password=sonar
	sonar.jdbc.url=jdbc:postgresql://192.168.1.1:5432/sonar
	sonar.web.host=0.0.0.0
	sonar.web.port=9000
	sonar.path.data=data
    sonar.path.temp=temp
	
#其他配置默认即可


#操作系统新增Sonarqube用户
useradd sonarqube
passwd 123456


#给Sonarqube文件夹赋予Sonarqube用户权限
cd /data/app/pats_opts/sonarqube-26.4.0.121862  
chown -R  sonarqube:sonarqube  *

系统配置优化:

bash 复制代码
echo "vm.max_map_count=262144" >> /etc/sysctl.conf
echo "fs.file-max = 6553560" >> /etc/sysctl.conf

sysctl -p


vim /etc/security/limits.conf
# 增加sonarqube用户大开文件数
sonarqube 	soft 	nofile 	65536
sonarqube 	hard 	nofile 	65536

切换到Sonarqube用户下启动服务

bash 复制代码
cd /opt/sonarqube-8.9.7/bin/linux-x86-64
    启动服务:./sonar.sh start
    停止服务:./sonar.sh stop
    重启服务:./sonar.sh restart

Sonarqube Web 管理界面登录

登录链接:http://192.168.1.1:9000/ 默认密码 admin admin123

首次登录会提示修改默认密码

Sonarqube与Jenkins集成

Jenkins 平台安装sonar 组件

注意!注意!注意!

我之前的Jenkins 版本是2.452.1,然后直接在jenkins 平台安装了"Sonar Quality Gates Plugin"&"SonarQube Scanner for Jenkins" 这两个组件时,平台默认是安装最新版本,且会更新很多依赖组件,待更新后重启Jenkins 时会发现启动失败,原因是升级的组件版本跟Jenkins版本不匹配。。。。。。迫不得已只能把Jenkins 升级到了2.555.1版本才能正常使用。

注意!注意!注意!

组件安装后Jenkins 配置Sonarqube 信息

SonarQube 平台新建专门给jenkins 使用的通用令牌

此令牌刚生成时需要复制下来,后面就看不到了。复制下来的通用令牌ID后面会使用到。

将SonarQube生成的通用令牌配置到Jenkins Credentials 中,点击"Add Credentials"

这个界面时,选择"Secret text",ID一栏输入上面复制的通用令牌ID信息 点击"Create"

Jenkins "系统配置"一栏新增SonarQube 信息

Jenkins "全局工具配置"一栏新增SonarQube Scanner 信息

Jenkins 到项目配置处增加"Execute SonarQube Scanner"

bash 复制代码
sonar.projectKey=project_dev_xxx   
# 正式源码(必填)
sonar.sources=src/main/java
# 测试代码(可选,单独统计)
sonar.tests=src/test/java
# Java 项目还需要指定编译输出
sonar.java.binaries=target/classes
#sonar.java.libraries=target/dependency/*.jar
sonar.coverage.jacoco.xmlReportPaths=target/site/jacoco/jacoco.xml

Sonarqube 本身并不生产代码覆盖率报告,结合上面的jacoco工具,sonarqube 需要扫描jacoco生成的jacoco.xml文件,并将代码覆盖率在Sonarqube平台上展示。

在项目的pom文件下增加配置是jacoco 生成jacoco.xml 文件。

上面介绍jacoco时已经在项目的pom文件下增加了jacoco 组件,但是上面的组件增加后,只生成jacoco.exec二进制文件,不生成jacoco.xml文件,需要在上面的基础只是增加下午红框中的代码即可

完整的代码如下所示:

bash 复制代码
            <plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>0.8.13</version>
                <executions>
                    <execution>
                        <id>prepare-agent</id>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>report</id>
                        <phase>package</phase>
                        <goals>
                            <goal>report</goal>
                        </goals>
                        <configuration>
                            <formats>
                                <format>XML</format>
                            </formats>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

构建成功后

jacoco 统计界面

Sonarqube 统计界面:

点击"Passed"会跳转到Sonarqube 界面

这样Sonarqube Jacoco 已经和Jenkins 集成成功了。

下一批文章将介绍

"DevOps 生态介绍(五):玩转SonarQube:代码静态扫描、Bug预警、质量门禁介绍"

相关推荐
IT WorryFree8 分钟前
AsciiDoc + Antora开局
运维
网络中的夜鹰15 分钟前
轩辕镜像一键安装Docker和Docker Compose脚本
运维·docker·容器
鹤落晴春24 分钟前
RH124问答5:管理本地用户和组
linux·运维·服务器
難釋懷1 小时前
Nginx对客户端的限制
运维·nginx
华奥系科技2 小时前
汛期城市内涝治理:智慧水务如何重塑防汛“安全感”?
大数据·运维·人工智能
IT WorryFree2 小时前
三套 Zabbix7.4 API 可直接复制 params 模板
运维·服务器·网络
Full Stack Developme2 小时前
Linux rm-rf 执行后,硬盘空间变化
linux·运维·服务器
跨境数据猎手2 小时前
独立站搭建:架构拆解+源码配置+运维复盘
运维·架构
楠目3 小时前
CVE-2017-7529 Nginx Range头整数溢出漏洞利用总结
运维·nginx
江湖有缘3 小时前
Docker部署HamsterBase Tasks任务管理工具
运维·docker·容器