Jenkins内修改allure报告名称

背景:

最近使用Jenkins搭建自动化测试环境时,使用Jenkins的allure插件生成的报告,一直显示默认ALLURE REPORT,想自定义成与项目关联的名称,如图所示,很明显自定义名称显得高大上些

本地修改方法:

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

python 复制代码
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.json
    with 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文件的代码:

python 复制代码
import os
import shutil

from configs.paths_config import OUT_FILES_DIR
from utils.allure_handle import AllureReportBeautiful


def get_env_from_jenkins(name, base=''):
    """从Jenkins中获取全局环境变量"""
    return os.getenv(name) and os.getenv(name).strip() or base


ProjectName = 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_path

    except Exception as e:
        print(f"错误发生: {e}")
        return None


if __name__ == '__main__':
    change_jenkins_allure_report_name()

Jenkins上构建后增加执行shell配置:

bash 复制代码
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压缩包内修改然后重新压缩,废话少说,代码如下:

python 复制代码
import json
import os
import tempfile
import zipfile

from configs.paths_config import OUT_FILES_DIR

def get_env_from_jenkins(name, base=''):
    """从Jenkins中获取全局环境变量"""
    return os.getenv(name) and os.getenv(name).strip() or base


ProjectName = 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.json
        with open(summary_file_path, 'r', encoding='utf-8') as file:
            summary_data = json.load(file)

        # 修改 summary.json 的内容
        summary_data['reportName'] = new_name

        # 保存修改后的 summary.json
        with 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_path


if __name__ == '__main__':
    modify_jenkins_allure_report_name_in_zip()

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

相关推荐
Bytebase7 分钟前
AWS re:Invent 2024 现场实录 - It‘s all about Scale
运维·数据库·dba·开发者·数据库管理·devops
‍理我1 小时前
Linux开发工具(补充)
linux·运维·服务器
m0_748255261 小时前
运维实战---多种方式在Linux中部署并初始化MySQL
linux·运维·mysql
一只鹿鹿鹿1 小时前
软件项目体系建设文档,项目开发实施运维,审计,安全体系建设,验收交付,售前资料(word原件)
java·大数据·运维·产品经理·设计规范
laimaxgg2 小时前
网络传输层TCP协议
linux·运维·网络·网络协议·tcp/ip
真正的醒悟2 小时前
负载均衡技术【内网去外网运营商出口负载均衡】
运维·负载均衡
会飞的爱迪生2 小时前
nginx反向代理和负载均衡的区别
运维·nginx·负载均衡
cpych2 小时前
linux centos挂载未分配的磁盘空间
linux·运维·服务器
LSZXZNJ2 小时前
负载均衡概述
运维·负载均衡
三雷科技3 小时前
docker代理设置
运维·docker·容器