Jenkins内修改allure报告名称

devtools/2025/1/11 13:31:07/

背景:        

        最近使用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/devtools/149620.html

相关文章

Python 模块 Uvicorn 实战指南

文章目录 1. 介绍和安装1.1 介绍1.2 安装 2. 创建基础应用2.1 简单的 HTTP 应用2.2 添加日志 3. 实现高级功能3.1 支持 WebSocket3.2 优化运行性能 4. Nginx 配置反向代理4.1 安装与配置 Nginx4.2 启用 SSL 支持4.3 性能优化建议 5. 常见问题与解决方案5.1 高并发问题5.2 WebSo…

ETL的工作原理

ETL的工作原理 什么是ETL_云计算主题库-阿里云 ETL的工作原理可以分为三个主要的步骤:Extract(提取)、Transform(转换)、Load(加载)。 工作步骤 描述 Extract (提取)…

Kotlin | Android Provider 的实现案例

目标 使用 Android Room 实现持久化库。 代码 Kotlin 代码编写 DemoDatabase,在build生成 DemoDatabase_Impl 疑问 Provider的数据会存在设备吗? 内部存储: 当使用 Room 创建数据库(如 DemoDatabase),数据库文件通常…

nginx运行之后显示的是上一个项目,如何解决

重启 Nginx 使配置生效 修改 Nginx 配置后,你需要重新加载或重启 Nginx,以使配置生效。执行以下命令: sudo nginx -t # 测试配置是否正确 sudo systemctl restart nginx # 重启 Nginxbash 复制代码 检查浏览器缓存 浏览器可能缓存了旧…

代码随想录算法训练营第六十天|KM94.城市间货物运输Ⅰ|KM95.城市间货物运输Ⅱ|KM96.城市间货物运输Ⅲ

94. 城市间货物运输 I 2、Bellman_ford队列优化算法(又名SPFA) SPFA是对Bellman_ford算法的优化,由于Bellman_ford 算法 每次都是对所有边进行松弛,其实是多做了一些无用功。其实只需要对 上一次松弛的时候更新过的节点作为出发节…

网络安全 | DevSecOps:将安全融入DevOps开发生命周期

网络安全 | DevSecOps:将安全融入DevOps开发生命周期 一、前言二、DevSecOps 的概念与原则2.1 DevSecOps 的概念2.2 DevSecOps 的原则 三、DevSecOps 的关键实践3.1 安全需求分析与管理3.2 安全设计与架构3.3 安全编码实践3.4 安全测试策略3.5 安全部署与运维 四、D…

sklearn-逻辑回归-制作评分卡

目录 数据集处理 分箱 分多少个箱子合适 分箱要达成什么样的效果 对一个特征进行分箱的步骤 分箱的实现 封装计算 WOE 值和 IV值函数 画IV曲线,判断最佳分箱数量 结论 pd.qcut 执行报错 功能函数封装 判断分箱个数 在银行借贷场景中,评分卡是…

宝塔安装教程,bt怎么安装 linux

Centos安装脚本 yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh 37a09b35 Ubuntu/Deepin安装脚本 wget -O install.sh http://download.bt.cn/install/install-ubuntu_6.0.sh && sudo b…