You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jenkins流水线:如何备份Robot Framework的output.xml用于邮件模板解析

当然可以实现!

完全不需要依赖归档构件,你只需要在Robot Publisher执行前,把生成的output.xml复制一份到安全的位置(或者直接在原目录重命名备份),就能避开它的自动删除逻辑。下面给你具体的Jenkins流水线实现方案:

具体步骤

1. 确定output.xml的路径

首先确认你的Robot Framework测试执行后,output.xml生成在哪个目录。通常默认是测试脚本所在的目录,比如${WORKSPACE}/robot-tests/output.xml(根据你的项目结构调整路径)。

2. 在Robot Publisher前添加复制操作

你有两种方式实现复制,选哪种都可以:

方式一:用Shell命令(简单直接)

在流水线里插入Shell步骤,把原文件复制为备份文件:

stage('Backup Robot Output') {
    steps {
        // 复制output.xml为output-backup.xml,路径根据你的实际情况修改
        sh 'cp ${WORKSPACE}/robot-tests/output.xml ${WORKSPACE}/robot-tests/output-backup.xml'
    }
}

方式二:用Groovy原生文件操作(不依赖Shell环境)

如果你的Jenkins agent环境可能没有Shell(比如Windows节点),可以用Groovy的文件API来复制:

stage('Backup Robot Output') {
    steps {
        script {
            def sourcePath = "${WORKSPACE}/robot-tests/output.xml"
            def backupPath = "${WORKSPACE}/robot-tests/output-backup.xml"
            
            def sourceFile = new File(sourcePath)
            def backupFile = new File(backupPath)
            
            // 复制文件内容(小文件适用)
            backupFile.text = sourceFile.text
            // 大文件推荐用流复制,更高效
            // sourceFile.withInputStream { input ->
            //     backupFile.withOutputStream { output ->
            //         output << input
            //     }
            // }
        }
    }
}

3. 后续邮件模板解析用备份文件

在你的邮件模板Groovy代码里,直接读取备份的文件即可:

def robotResults = new XmlSlurper().parse(new File("${WORKSPACE}/robot-tests/output-backup.xml"))
// 接下来就可以解析robotResults提取测试信息了

为什么这个方案可行?

Robot Publisher插件默认只会清理它指定的测试输出文件(也就是你配置的output.xml原文件),你手动复制出来的备份文件不在它的清理列表里,所以后续的邮件解析步骤可以正常访问这份备份,完全不需要归档构件。

如果不确定路径是否正确,可以在复制前加个步骤验证文件存在:

sh 'ls -la ${WORKSPACE}/robot-tests/' // Linux/macOS环境
// Windows环境替换为
// bat 'dir ${WORKSPACE}\\robot-tests\\'

内容的提问来源于stack exchange,提问作者BMuell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 12:52:56