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()

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

相关推荐
stormsha11 分钟前
Linux中su与sudo命令的区别:权限管理的关键差异解析
linux·运维·服务器·鸿蒙系统·ux·batch命令
新加坡内哥谈技术43 分钟前
Meta计划借助AI实现广告创作全自动化
运维·人工智能·自动化
zyjyyds1131 小时前
win11系统 Docker Desktop 突然提示Docker Engine stopped解决情况之一
运维·docker·容器
Altairr1 小时前
Docker基础(一)
运维·docker·容器·eureka
文牧之1 小时前
PostgreSQL 的扩展pageinspect
运维·数据库·postgresql
小兔子酱#2 小时前
【Docker 01】Docker 简介
运维·docker·容器
jugt3 小时前
CentOS 7.9安装Nginx1.24.0时报 checking for LuaJIT 2.x ... not found
linux·运维·centos
21号 15 小时前
9.进程间通信
linux·运维·服务器
zmm04209 小时前
Could not get unknown property ‘mUser‘ for Credentials [username: null]
jenkins·gradle
搬码临时工10 小时前
电脑同时连接内网和外网的方法,附外网连接局域网的操作设置
运维·服务器·网络