Jenkins内修改allure报告名称

背景:        

        最近使用Jenkins搭建自动化测试环境时,使用Jenkins的allure插件生成的报告,一直显示默认ALLURE REPORT,想自定义成与项目关联的名称,如图所示,很明显自定义名称显得高大上些,之前已经更换过本地allure报告的名称了,发现在Jenkins上不生效,这次就一起说说两种更改方式

本地修改方法:        

        最开始想到的办法是本地通过代码直接修改生成的allure报告内的widgets/summary.json文件的方式,代码如下:

def set_report_name(new_name):"""修改Allure报告Overview的标题文案@param new_name:  需要更改的标题文案 【 原文案为:ALLURE REPORT 】@return:"""title_filepath = os.path.join(ALLURE_REPORT_DIR, "widgets", "summary.json")# 检查summary.json文件是否存在if not os.path.exists(title_filepath):raise FileNotFoundError(f"修改报告名称时,summary.json文件未找到: {title_filepath}")# 读取summary.json中的内容with open(title_filepath, 'r', encoding='utf-8') as f:params = json.load(f)# 修改报告名称params['reportName'] = new_name# 将修改后的内容写回summary.jsonwith open(title_filepath, 'w', encoding='utf-8') as f:json.dump(params, f, ensure_ascii=False, indent=4)

        通过这种方式发现本地能修改成功,并且本地打开allure也能正常显示修改后的报告名称。但是上传代码后,发现在Jenkins上的allure报告并未被修改成功。

通过一系列的排查,终于找到问题所在:

  1. Jenkins是通过allure插件生成的报告,并不是我代码里执行生成allure报告的代码生成的,所以它是在整个测试过程结束后,插件自动生成的allure代码,所以我修改allure报告的代码执行后,相当于是修改的之前生成的报告,后面插件又生辰本次的执行结果报告覆盖了我的修改,所以没生效
  2. 通过问题1的排查,于是我加了构建后步骤修改allure报告名的脚步,也就是在Jenkins生成allure报告后再修改allure报告名称的步骤,发现allure报告名称确实修改成功了,但是在Jenkins上打开allure报告还是显示的默认名称,于是又再再再经过一系列排查,发现Jenkins打开的报告其实并不是生成的allure报告目录,而是Jenkins每次构建的成果物里的allure-report.zip压缩包。

如下图所示:

Jenkins上修改方法:        

        通过上面的总结,于是便有了下面的方式,先修改allure报告目录内的名称,然后再压缩整个allure报告,覆盖成果物内的allure-report.zip文件

修改Jenkins allure报告并覆盖zip文件的代码:

import os
import shutilfrom configs.paths_config import OUT_FILES_DIR
from utils.allure_handle import AllureReportBeautifuldef get_env_from_jenkins(name, base=''):"""从Jenkins中获取全局环境变量"""return os.getenv(name) and os.getenv(name).strip() or baseProjectName = get_env_from_jenkins("JOB_NAME")  # Jenkins构建项目名称
BUILD_URL = get_env_from_jenkins("BUILD_URL")  # Jenkins构建项目URL
BUILD_NUMBER = get_env_from_jenkins("BUILD_NUMBER")  # Jenkins构建编号
ALLURE_URL = BUILD_URL + 'allure/'  # Jenkins构建的allure报告地址
JENKINS_HOME = get_env_from_jenkins("JENKINS_HOME")  # Jenkins的主目录def change_jenkins_allure_report_name():"""从环境变量中读取报告名称并修改Allure报告名称,此方法只针对Jenkins使用allure插件生成的报告"""try:# 从环境变量中读取报告名称new_name = os.getenv('ALLURE_REPORT_NAME','Allure Report')  # 如果环境变量中没有ALLURE_REPORT_NAME并且未传报告名称参数,默认使用'Allure Report'if not new_name:raise ValueError("环境变量'ALLURE_REPORT_NAME'未设置或为空。")print(f"使用Allure报告名称: {new_name}")# 设置Allure报告名称(引用的上面的那个方法)set_report_name(new_name)# 保存压缩文件目标路径(压缩文件将移动到这里)zip_path = os.path.join(JENKINS_HOME, 'jobs', ProjectName, 'builds', BUILD_NUMBER, 'archive','allure-report.zip')# 确保压缩文件不存在,如果存在先删除if os.path.exists(zip_path):os.remove(zip_path)print(f"已删除现有zip文件:{zip_path} ")# 使用shutil.make_archive压缩整个Allure Report目录并移动到目标目录(OUT_FILES_DIR参数的作用是保留原目录名称)shutil.make_archive(zip_path.replace('.zip', ''), 'zip', OUT_FILES_DIR, 'allure_report')print(f"Allure报告压缩为: {zip_path}")# 返回压缩后的文件路径return zip_pathexcept Exception as e:print(f"错误发生: {e}")return Noneif __name__ == '__main__':change_jenkins_allure_report_name()

Jenkins上构建后增加执行shell配置(需要下载PostBuildScript插件,才能在构建后步骤中增加执行shell步骤):

export PYTHONPATH=$WORKSPACE:$PYTHONPATH
export ALLURE_REPORT_NAME=API自动化测试报告
pwd
source /Users/wangjie/SensoroUiAutoTest/venv/bin/activate
python3 utils/jenkins_handle.py

最后大功告成,成功修改allure报告的名字,但是目前实测还是有些问题,会导致allure报告的历史数据图表没了,如下图所示:

最终方法:

        由于上面的方法虽然成功修改了Jenkins上报告名称,但是会导致后面生成的allure报告无法展示历史趋势图,于是经过又又又又又。。。。一系列的更改,就有了最终版的完美解决方案,思路是,既然上面的方法用allure-report压缩覆盖会导致新生成的报告历史趋势有问题,那我就这次不压缩覆盖了,直接在原zip压缩包内修改然后重新压缩,废话少说,代码如下:

import json
import os
import tempfile
import zipfilefrom configs.paths_config import OUT_FILES_DIRdef get_env_from_jenkins(name, base=''):"""从Jenkins中获取全局环境变量"""return os.getenv(name) and os.getenv(name).strip() or baseProjectName = get_env_from_jenkins("JOB_NAME")  # Jenkins构建项目名称
BUILD_URL = get_env_from_jenkins("BUILD_URL")  # Jenkins构建项目URL
BUILD_NUMBER = get_env_from_jenkins("BUILD_NUMBER")  # Jenkins构建编号
ALLURE_URL = BUILD_URL + 'allure/'  # Jenkins构建的allure报告地址
JENKINS_HOME = get_env_from_jenkins("JENKINS_HOME")  # Jenkins的主目录def modify_jenkins_allure_report_name_in_zip():"""直接修改Jenkins构建归档中的allure-report.zip压缩包的报告名称,然后重新压缩,相比较于上面的change_jenkins_allure_report_name方法的好处是直接在原压缩包内修改:return:"""# 从环境变量中读取报告名称new_name = os.getenv('ALLURE_REPORT_NAME','Allure Report')  # 如果环境变量中没有ALLURE_REPORT_NAME并且未传报告名称参数,默认使用'Allure Report'# 找到zip文件路径zip_path = os.path.join(JENKINS_HOME, 'jobs', ProjectName, 'builds', BUILD_NUMBER, 'archive','allure-report.zip')# 检查allure-report.zip压缩包是否存在if not os.path.exists(zip_path):raise FileNotFoundError(f"allure-report.zip压缩包未找到:{zip_path}")# 临时文件夹用于存放解压后的内容with tempfile.TemporaryDirectory() as temp_dir:# 打开并提取 zip 文件with zipfile.ZipFile(zip_path, 'r') as zip_ref:zip_ref.extractall(temp_dir)# 定义需要修改的文件路径summary_file_path = os.path.join(temp_dir, 'allure_report', 'widgets', 'summary.json')# 检查 summary.json 是否存在if not os.path.exists(summary_file_path):raise FileNotFoundError(f"在zip归档文件中找不到summary.json文件:{summary_file_path}")# 读取原始 summary.jsonwith open(summary_file_path, 'r', encoding='utf-8') as file:summary_data = json.load(file)# 修改 summary.json 的内容summary_data['reportName'] = new_name# 保存修改后的 summary.jsonwith open(summary_file_path, 'w', encoding='utf-8') as file:json.dump(summary_data, file, indent=4, ensure_ascii=False)# 创建一个新的 zip 文件,并将修改后的文件重新压缩new_zip_path = zip_path.replace('.zip', '.zip')with zipfile.ZipFile(new_zip_path, 'w', zipfile.ZIP_DEFLATED) as zip_ref:# 遍历解压后的文件夹,重新压缩成一个新的 zip 文件for foldername, subfolders, filenames in os.walk(temp_dir):for filename in filenames:file_path = os.path.join(foldername, filename)# 设置正确的 arcname,以保持 zip 文件的原有结构arcname = os.path.relpath(file_path, temp_dir)zip_ref.write(file_path, arcname)print(f"修改后重新压缩zip文件: {new_zip_path}")return new_zip_pathif __name__ == '__main__':modify_jenkins_allure_report_name_in_zip()

最后,完美解决,并且历史趋势图正常展示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/540.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ROS Action接口

实现自主导航是使用Action接口的主要目的 在实际使用navigation导航系统的时候,机器人需要自主进行导航。不能每次都手动设置导航的目标点。所以需要编写程序代码来实现导航控制。这就需要使用到navigation的导航接口。Navigation的这个导航接口有好几个。Rose官方…

【复习小结】1-13

数学追求更简洁的表达,计算机追求更简单的表达。数据结构把数学的逻辑结构放进计算器的存储器。 DAY4 闰年的计算 布尔类型是一种数据类型,用于表示逻辑值的简单类型,它的值只能是真(true)或假(false&…

docker安装windows desktop后打开失败

解决:运行以下命令在windows上安装linux环境,然后设置用户名密码即可 wsl --install

H2数据库在单元测试中的应用

H2数据库特征 用比较简洁的话来介绍h2数据库,就是一款轻量级的内存数据库,支持标准的SQL语法和JDBC API,工业领域中,一般会使用h2来进行单元测试。 这里贴一下h2数据库的主要特征 Very fast database engineOpen sourceWritten…

计算机网络 (33)传输控制协议TCP概述

一、定义与基本概念 TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。它工作在OSI模型的第四层,即传输层,为用户提供可靠的、有序的和无差错的数据传输服务。TCP协议与UDP协议是传输层的两大主要协议,但两者在设计上有明显的不同&…

转运机器人在物流仓储行业的优势特点

在智能制造与智慧物流的浪潮中,一款革命性的产品正悄然改变着行业的面貌——富唯智能转运机器人,它以卓越的智能科技与创新的设计理念,引领着物流领域步入一个全新的高效、智能、无人的时代。 一、解放双手,重塑物流生态 富唯智能…

【论文阅读+复现】High-fidelity Person-centric Subject-to-Image Synthesis

以人物为中心的主体到图像的高保真合成,CVPR2024 code:CodeGoat24/Face-diffuser: [CVPR2024] Official implementation of High-fidelity Person-centric Subject-to-Image Synthesis. paper:2311.10329 背景 研究问题:这篇文…

做一个 简单的Django 《股票自选助手》显示 用akshare 库(A股数据获取)

图: 股票自选助手 这是一个基于 Django 开发的 A 股自选股票信息查看系统。系统使用 akshare 库获取实时股票数据,支持添加、删除和更新股票信息。 功能特点 支持添加自选股票实时显示股票价格和涨跌幅一键更新所有股票数据支持删除不需要的股票使用中…

USB学习——基本概念

文章目录 USB(Universal Serial Bus)概述USB系统的描述USB总线传输方式USB的拓扑结构 USB的连接模型USB控制器及分类USB描述符USB 端点USB枚举过程USB 四种传输类型USB 事务批量传输(Bulk)中断传输(Interrupt)等时传输(Isochronous)控制传输(Control)端点…

通信与网络安全之网络连接

一.传输介质类型 1.基本概念 计算机总是以二进制的数字(0或1)形式工作 1)数字和模拟 模拟数据一般采用模拟信号(Analog Signal),例如用一系列连续变化的电磁波(如无线电与电视广播中的电磁波),或电压信号(如电话传…

ConvNeXt V2: Co-designing and Scaling ConvNets with Masked Autoencoders论文解读

论文地址:https://arxiv.org/abs/2301.00808 论文相对ConvNeXt V1的改进主要两点 全卷积掩码自编码器(FCMAE)Global Response Normalization,去除Layer scale 什么是layer scale 实验 先用FCMAE预训练,然后微调

Formality:两种等价状态consistency和equality

相关阅读 Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482 背景 逻辑锥的等价性检查时,存在两种验证模式:一致(consistency)和等同(equality),要理解这两点,首先得明白综合工具…

【LeetCode】力扣刷题热题100道(26-30题)附源码 轮转数组 乘积 矩阵 螺旋矩阵 旋转图像(C++)

目录 1.轮转数组 2.除自身以外数组的乘积 3.矩阵置零 4.螺旋矩阵 5.旋转图像 1.轮转数组 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 class Solution { public:void rotate(vector<int>& nums, int k) …

51单片机 AT24C02(I2C总线)

存储器 随机存储 RAM 只读存储 ROM AT24C02芯片 是一种可以实现掉电不丢失的存储器&#xff0c;可用于保存单片机运行时想要永久保存的数据信息 存储材质&#xff1a;E2PROM 通讯接口&#xff1a;I2C总线 容量&#xff1a;256字节 I2C总线 一种通用的数据总线 两根通信线…

G1原理—5.G1垃圾回收过程之Mixed GC

大纲 1.Mixed GC混合回收是什么 2.YGC可作为Mixed GC的初始标记阶段 3.Mixed GC并发标记算法详解(一) 4.Mixed GC并发标记算法详解(二) 5.Mixed GC并发标记算法详解(三) 6.并发标记的三色标记法 7.三色标记法如何解决错标漏标问题 8.SATB如何解决错标漏标问题 9.重新梳…

每天五分钟深度学习:神经网络中的激活函数

本文重点 激活函数在神经网络中是必不可以缺少的东西,当我们创建一个神经网络的时候,我们需要决定使用哪种激活函数用在隐藏层上,哪种激活函数用在输出结点上,我们以前的课程中我们使用的都是sigmoid激活函数,除此之外还有其它激活函数。本文我们就介绍一下那些经常使用的…

Java Web开发基础:HTML的深度解析与应用

文章目录 前言&#x1f30d;一.B/S 软件开发架构简述&#x1f30d;二.HTML 介绍❄️2.1 官方文档❄️2.2 网页的组成❄️2.3 HTML 是什么❄️2.4html基本结构 &#x1f30d;三.HTML标签1.html 的标签/元素-说明2. html 标签注意事项和细节3.font 字体标签4.标题标签5.超链接标签…

iostat命令详解

iostat 命令是 I/O statistics(输入/输出统计)的缩写&#xff0c;用来报告系统的 CPU 统计信息和块设备及其分区的 IO 统计信息。iostat 是 sysstat 工具集的一个工具&#xff0c;在 Ubuntu 系统中默认是不带 iostat 命令的&#xff0c;需要自行安装&#xff1a; $ sudo apt in…

【数据库系统概论】数据库恢复技术

目录 11.1 事务的基本概念 事务的定义 事务的开始与结束 事务的ACID特性 破坏ACID特性的因素 11.2 数据库恢复概述 11.3 故障的种类 1. 事务内部的故障 2. 系统故障 3. 介质故障 4. 计算机病毒 11.4 恢复的实现技术 如何建立冗余数据 数据转储 登记日志文件 11…

通过Android Studio修改第三方jar包并重新生成jar包

最近接手了来自公司其他同事的一个Unity项目,里面有一个封装的jar包要改动一下,无奈关于这个jar包的原工程文件丢失了,于是自己动手来修改下jar包,并做下记录。 一、导入第三方jar包 1、新建项目EditJarDemo(项目名随便取) 2、新建libs文件夹,把你要修改的third.jar 复制…