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预警、质量门禁介绍"

相关推荐
草莓熊Lotso13 小时前
【Linux系统加餐】从原理到封装:基于建造者模式实现System V信号量工业级C++封装
android·linux·运维·服务器·网络·c++·建造者模式
广州灵眸科技有限公司19 小时前
瑞芯微(EASY EAI)RV1126B 核心板供电电路
linux·运维·服务器·单片机·嵌入式硬件·电脑
keyipatience19 小时前
18.Linux进程退出和进程等待机制详解
linux·运维·服务器
仙柒41520 小时前
控制平面组件和节点组件
运维·容器·kubernetes
齐齐大魔王20 小时前
Linux-网络编程实战
linux·运维·网络
wanhengidc21 小时前
私有云的作用都有哪些?
运维·服务器·网络·游戏·智能手机
花阴偷移21 小时前
Ubuntu 22.04版本下配置静态IP
linux·运维·服务器·tcp/ip·ubuntu
牛马十年21 小时前
当自动化运维系统被ai重构后
运维·人工智能·自动化