Jenkins内修改allure报告名称

news/2025/1/13 14:47:54/

背景:        

        最近使用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.ppmy.cn/news/1562822.html

相关文章

【MySQL】第三章 库的操作

系列文章目录 《【MySQL】第一章 MySQL 5.7的安装与卸载》 《【MySQL】第二章 初识数据库》 《【MySQL】第三章 库的操作》 《【MySQL】第四章 表的操作》 《【MySQL】第五章 数据类型》 文章目录 系列文章目录库的增删查改创建数据库删除数据库查看数据库查看数据库查看数据库…

实训云上搭建集群

文章目录 1. 登录实训云1.1 实训云网址1.2 登录实训云 2. 创建网络2.1 网络概述2.2 创建步骤 3. 创建路由器3.1 路由器名称3.1 创建路由器3.3 查看网络拓扑 4. 连接子网5. 创建虚拟网卡5.1 创建原因5.2 查看端口5.3 创建虚拟网卡 6. 管理安全组规则6.1 为什么要管理安全组规则6…

Leetcode 967 Numbers With Same Consecutive Differences

题意 给定n,代表整数的长度,给定k代表两个相邻数字之间的间隔。求所有的值构成的组合 题目链接 https://leetcode.com/problems/numbers-with-same-consecutive-differences/description/ 题解 dfs,有k位置要选,第一个位置我…

【JVM-2.1】如何使用JMC监控工具:详细步骤与实战指南

Java Mission Control(JMC)是Oracle提供的一个高级图形化监控工具,专为Java应用程序的性能分析和故障排查设计。JMC不仅提供了实时监控功能,还支持飞行记录器(Flight Recorder)功能,能够记录JVM…

深入剖析 Java 设计模式之观察者模式

一、开篇语 在 Java 编程的广袤天地里,设计模式宛如一盏盏明灯,照亮我们构建高效、灵活且可维护代码体系的道路。其中,观察者模式作为一种极具影响力的行为型设计模式,在众多实际开发场景中展现出非凡的价值。它就如同现实世界中…

Apache和PHP:构建动态网站的黄金组合

在当今的互联网世界,网站已经成为了企业、个人和机构展示自己、与用户互动的重要平台。而在这些动态网站的背后,Apache和PHP无疑是最受开发者青睐的技术组合之一。这一组合提供了高效、灵活且可扩展的解决方案,帮助您快速搭建出强大的网站&am…

LKT4304新一代算法移植加密芯片,守护物联网设备和云服务安全

凌科芯安作为一家在加密芯片领域深耕18年的企业,主推的LKT4304系列加密芯片集成了身份认证、算法下载、数据保护和完整性校验等多方面安全防护功能,可以为客户的产品提供一站式解决方案,并且在调试和使用过程提供全程技术支持,针对…

Maven多模块项目如何灵活构建

Maven多模块项目如何灵活构建 Maven多模块项目如何灵活构建示例项目构建所有模块构建parent和core模块构建parent和extension模块 Maven多模块项目如何灵活构建 在Java开发中使用maven来处理包管理是很便捷的,然而开发过程中多模块开发是常规操作。那么多模块开发过…