Jenkins集成Jacoco实现覆盖率测试报告

Jenkins集成Jacoco实现覆盖率测试报告 1.下载下载Jacoco的工具包可参考我的另一篇博客JaCoCo实战通过Jacocoagent插桩轻松获取Java覆盖率_jacocoagent日志远程导出本地-CSDN博客2.放置jar包到测试环境对应位置以linux系统为例子/opt/jacoco/lib/目录下面3.在Jenkins上面下载对应的插件3.1 dashboard -》Manage Jenkins3.2 下拉选择Manage Plugins在Available Plugins搜索“Jacoco”因为我已经下载过所以在updates直接可以搜到4. 上传对应jar包到测试服务器上面配置执行脚本在java -jar命令里面添加使用jacocoagnet.jarnohup java -javaagent:/opt/jacoco/lib/jacocoagent.jarincludescom.cffex.business.*,outputtcpserver,port6300,address0.0.0.0,appendtrue -Xmx2048m -jar gf-business.jar /dev/null 21 参数值核心行为通俗理解appendtrue追加模式Jacoco 代理会持续在内存中追加记录所有执行数据应用启动 接口调用 后续所有操作每次 dump 时会把 “从应用启动到 dump 时刻的所有数据” 完整写入coverage.exec且不会清空内存中的数据。像写日记从起床启动到睡觉dump所有做过的事接口调用都记下来不会删之前的内容。appendfalse默认覆盖模式acoco 代理仅在内存中保留 “最新一次的执行数据”每次 dump 后会清空内存中的数据若 dump 前未主动触发接口调用内存中只有启动数据dump 后就只能拿到启动数据。像写临时便签写一条新的接口调用就删旧的启动数据若没写新的便签上只有最初的内容。5. Jenkins创建部署任务(以jacocoagent插桩方式运行)5.1 新建Item -》 配置5.2 配置引入git地址配置 build Steps配置SSH Server name输入测试服务器地址要提前配置root账号免密登录6.Jenkins创建生成测试报告的任务6.1 配置git用来获取源码6.2 配置build StepsPS这步主要是利用jacoco工具生成exec文件来生成测试报告的目录文件然后推送exec文件和class文件到Jenkins工作台方便后续插件生成报告要配置jenkins的root用户免登录sh脚本注意替换JENKINS_SERVER_IP和JENKINS_WORKSPACE自己的内容#!/bin/bash # dump_coverage.sh - 生成JaCoCo覆盖率数据文件并自动推送至Jenkins工作空间 # 自定义配置 # JaCoCo基础配置 JACOCO_CLI_JAR/opt/jacoco/lib/jacococli.jar COV_FILE/root/app-service/gf-business/coverage.exec JACOCO_PORT6300 JAVA_HOME/usr/local/jdk-8 APP_NAMEgf-business.jar # Jenkins推送配置根据你的实际环境修改 JENKINS_SERVER_IP你的Jenkins服务器IP # Jenkins服务器IP JENKINS_USERroot # Jenkins登录用户 JENKINS_WORKSPACE/var/lib/jenkins/workspace/你的工作空间名字/ # Jenkins任务工作空间 # class路径配置 APP_JAR_PATH/root/app-service/gf-business/gf-business.jar TEMP_CLASS_DIR/tmp/gf-business-classes # 临时解压目录 # # 日志函数带时间戳便于排查 log() { echo [$(date %Y-%m-%d %H:%M:%S)] [$1] $2 } # 错误退出函数 error_exit() { log ERROR $1 exit 2 } # 环境初始化 export LANGen_US.UTF-8 export LC_ALLen_US.UTF-8 export PATH$JAVA_HOME/bin:$PATH log INFO 开始执行覆盖率数据dump及推送流程... # 前置检查 # 检查Java环境 if ! command -v java /dev/null; then error_exit Java环境不存在JAVA_HOME$JAVA_HOME fi # 检查jacococli.jar是否存在 if [ ! -f $JACOCO_CLI_JAR ]; then error_exit jacococli.jar不存在$JACOCO_CLI_JAR fi # 检查scp命令是否存在推送必备 if ! command -v scp /dev/null; then error_exit 未找到scp命令请执行yum install -y openssh-clients 安装 fi # 检查应用进程修复原脚本PID提取错误ps -ef中PID在第2列原脚本是$1 APP_PID$(ps -ef | grep -E [j]ava.*$APP_NAME | awk {print $2}) if [ -z $APP_PID ]; then error_exit 未找到应用进程$APP_NAME fi log INFO 找到应用PID$APP_PID # 生成exec文件 # 删除旧exec文件 if [ -f $COV_FILE ]; then rm -f $COV_FILE log INFO 已删除旧的exec文件$COV_FILE fi log INFO 开始dump覆盖率数据到$COV_FILE java -jar $JACOCO_CLI_JAR dump \ --address localhost \ --port $JACOCO_PORT \ --destfile $COV_FILE \ --quiet # 静默模式减少日志输出 # 校验dump结果文件存在且非空 if [ $? -ne 0 ] || [ ! -f $COV_FILE ] || [ ! -s $COV_FILE ]; then error_exit dump失败请检查1.JaCoCo端口$JACOCO_PORT是否连通 2.应用是否启动JaCoCo代理 fi log INFO ✅ dump成功exec文件大小$(du -h $COV_FILE | awk {print $1}) # 推送至Jenkins log INFO 开始推送exec文件至Jenkins$JENKINS_USER$JENKINS_SERVER_IP:$JENKINS_WORKSPACE # 执行scp推送-q静默模式减少冗余输出-o避免主机密钥检查报错 scp -q -o StrictHostKeyCheckingno $COV_FILE $JENKINS_USER$JENKINS_SERVER_IP:$JENKINS_WORKSPACE/ # 校验推送结果 if [ $? -eq 0 ]; then log INFO ✅ exec文件推送成功 # 可选远程验证Jenkins端文件是否非空增强校验 ssh -o StrictHostKeyCheckingno $JENKINS_USER$JENKINS_SERVER_IP if [ -s $JENKINS_WORKSPACE/coverage.exec ]; then echo Jenkins端验证exec文件存在且非空 else echo Jenkins端验证exec文件为空或不存在 exit 1 fi if [ $? -eq 0 ]; then log INFO ✅ Jenkins端文件验证通过 else error_exit ❌ 推送成功但Jenkins端文件异常请检查目录权限$JENKINS_WORKSPACE fi else error_exit ❌ exec文件推送失败请检查1.应用服务器到Jenkins的SSH免密配置 2.Jenkins目录权限 3.IP/路径是否正确 fi # 解压Jar包并推送class文件 log INFO 开始解压应用Jar包$APP_JAR_PATH # 清空旧临时目录重新创建 rm -rf $TEMP_CLASS_DIR mkdir -p $TEMP_CLASS_DIR # 只解压BOOT-INF/classes目录Spring Boot Jar的class文件目录忽略其他文件 unzip -o $APP_JAR_PATH BOOT-INF/classes/* -d $TEMP_CLASS_DIR /dev/null 21 # 检查解压结果 if [ ! -d $TEMP_CLASS_DIR/BOOT-INF/classes ] || [ -z $(ls -A $TEMP_CLASS_DIR/BOOT-INF/classes) ]; then error_exit ❌ Jar包解压失败或无class文件请检查Jar包完整性 fi log INFO ✅ Jar包解压成功class文件目录$TEMP_CLASS_DIR/BOOT-INF/classes # 推送class文件到Jenkins的target/classes目录 log INFO 开始推送class文件至Jenkins$JENKINS_USER$JENKINS_SERVER_IP:$JENKINS_WORKSPACE/target/classes/ # 先在Jenkins创建target/classes目录避免目录不存在 ssh -o StrictHostKeyCheckingno -o LogLevelERROR $JENKINS_USER$JENKINS_SERVER_IP mkdir -p $JENKINS_WORKSPACE/target/classes/ # 递归推送class文件 scp -r -q -o StrictHostKeyCheckingno -o LogLevelERROR $TEMP_CLASS_DIR/BOOT-INF/classes/* $JENKINS_USER$JENKINS_SERVER_IP:$JENKINS_WORKSPACE/target/classes/ # 校验class推送结果 if [ $? -eq 0 ]; then log INFO ✅ class文件推送成功 # 远程验证Jenkins端class文件是否存在 ssh -o StrictHostKeyCheckingno -o LogLevelERROR $JENKINS_USER$JENKINS_SERVER_IP if [ -d $JENKINS_WORKSPACE/target/classes ] [ -n \$(ls -A $JENKINS_WORKSPACE/target/classes) ]; then echo Jenkins端class文件验证通过 else echo Jenkins端class文件目录为空或不存在 exit 1 fi if [ $? -ne 0 ]; then error_exit ❌ 推送成功但Jenkins端class文件异常请检查目录权限$JENKINS_WORKSPACE/target/classes fi else error_exit ❌ class文件推送失败请检查1.SSH免密配置 2.Jenkins目录权限 fi # 推送后修改Jenkins文件权限root免密 log INFO 通过root免密修改Jenkins工作空间权限为jenkins用户 # 无需输入密码直接远程执行权限修改命令 ssh -o StrictHostKeyCheckingno -o LogLevelERROR root10.38.112.246 # 递归修改所有权为jenkins chown -R jenkins:jenkins /var/lib/jenkins/workspace/gf-busniess-test-report/ # 修复权限 chmod -R 755 /var/lib/jenkins/workspace/gf-busniess-test-report/ if [ $? -eq 0 ]; then log INFO ✅ Jenkins文件权限修改成功 else log WARN ⚠️ 权限修改失败请检查root免密登录是否配置成功 fi # 权限修改结束 # 执行完成 # 清理临时目录 rm -rf $TEMP_CLASS_DIR log INFO 全部流程完成exec文件已生成并推送至Jenkins工作空间 exit 06.3 配置构建后操作7.执行构建观察工作空间是否有文件生成对应报告和覆盖率正常展示