Jenkins管道发布HTML报告

10

Maven清理安装会在以下位置生成新的HTML文件

/var/lib/jenkins/workspace/Docs_LoadTest/target/jmeter/reports/DocsJmeterTests_20170601_151330/index.html

这里的“DocsJmeterTests_20170601_151330”将在每次运行时更改。因此,我正在尝试使用发布HTML报告插件发布HTML报告。以下是我的Pipeline脚本

node {
build job: 'Docs_LoadTest'
stage('Results') {
publishHTML([allowMissing: false,
         alwaysLinkToLastBuild: true,
         keepAll: true,
         reportDir: 
        '/var/lib/jenkins/workspace/Docs_LoadTest/target/jmeter/reports/*/',
         reportFiles: 'index.html',
         reportName: 'Docs Loadtest Dashboard'
         ])

 }
 }

在运行任务时出现以下错误:
[htmlpublisher]正在存档HTML报告... [htmlpublisher]正在存档BUILD级别的/var/lib/jenkins/workspace/Docs_LoadTest/target/jmeter/reports/*至/var/lib/jenkins/jobs/Docs_Pipeline/builds/10/htmlreports/Docs_Loadtest_Dashboard ERROR:指定的HTML目录'/var/lib/jenkins/workspace/Docs_LoadTest/target/jmeter/reports/*'不存在。
即使我们尝试了以下选项,也没有起作用:
/var/lib/jenkins/workspace/Docs_LoadTest/target/jmeter/reports/**/ /var/lib/jenkins/workspace/Docs_LoadTest/target/jmeter/reports/DocsJmeterTests_* /var/lib/jenkins/workspace/Docs_LoadTest/target/jmeter/reports/DocsJmeterTests_*_*


你能提供一些有关你的Jenkins设置的更多信息吗?是否有多个工作节点/从节点?你的下游任务被触发时是否设置为使用硬编码的工作区?你下游任务的节点标签是否相同? - Spencer Malone
@Saagar,看看我的答案,它可能会有所帮助:https://stackoverflow.com/a/54203222/5770004 - Gavriel Cohen
4个回答

12

HTML发布者插件似乎不支持通配符。 在您的Pipeline中,可以使用Linux的复制命令,因为它可以使用通配符。

这将复制[Docs_LoadTest]/jmeter/reports文件夹中所有目录的内容到本地工作区中的jmeter_results文件夹中:

sh 'cp -r /var/lib/jenkins/workspace/Docs_LoadTest/target/jmeter/reports/*/. target/jmeter_results/'

请注意,您必须在每次运行之间清理Docs_LoadTest文件夹中的目标文件夹和管道,否则此解决方案将复制多个报告。

更好的解决方案:

可以在Docs_LoadTest中应用此技巧,并使用发布工件和复制工件功能。这样可以避免硬编码到其他作业的路径,并且即使管道在另一个从机上执行,也可以正常工作。这需要复制工件插件

假设Docs_LoadTest是自由风格作业:

  1. 添加一个Execute Shell构建步骤,将结果复制到一个固定的文件夹(例如jmeter_results)中:

    mkdir -p target/jmeter_results/ cp -r target/jmeter/reports/*/. target/jmeter_results/

  2. 然后添加一个归档工件后构建归档步骤,要归档以下文件:

    target/jmeter_results/*

在您的管道中:

  1. 使用复制工件步骤将文件复制到本地工作区中的target/jmeter_results文件夹:

    step ([$class: 'CopyArtifact', projectName: 'Docs_LoadTest', filter: 'target/jmeter_results/*']);

  2. 更改对HTML发布程序的调用以使用此文件夹:

    publishHTML([allowMissing: false, alwaysLinkToLastBuild: true, keepAll: true, reportDir: 'target/jmeter_results', reportFiles: 'index.html', reportName: 'Docs Loadtest Dashboard' ])


8

我曾遇到类似问题,只是我想要发布多个报告。

最终我做的是添加一个简单的Groovy脚本来迭代报告目录中的文件。您可以使用同样/类似的方法来获取文件名。

 stage('publish reports') {
        steps {
            unstash 'source'

            script {
                sh 'ls target/jmeter/reports > listFiles.txt'
                def files = readFile("listFiles.txt").split("\\r?\\n");
                sh 'rm -f listFiles.txt'

                for (i = 0; i < files.size(); i++) {
                    publishHTML target: [
                        allowMissing:false,
                        alwaysLinkToLastBuild: false,
                        keepAll:true,
                        reportDir: 'target/jmeter/reports/' + files[i],
                        reportFiles: 'index.html',
                        reportName: files[i]
                    ]
                }                   
            }           
        }
    }

注意:此示例用于声明式流水线。有关readFile函数的文档。


4
这个答案会创建许多菜单条目。如果您想要一个具有多个选项卡的单个菜单条目,可以像这样使用:reportDir: 'target/jmeter/reports', reportFiles:files.join(','),reportName:'jMeter报告'。使用reportTitles为选项卡提供漂亮的名称即可。 - Raphael
1
嗨@Raphael,但在这种情况下,目标/jmeter/reports文件夹下将有多个文件夹。恐怕您可能需要像此答案中建议的那样明确指定报告目录。 - James Selvakumar
@JamesSelvakumar @Raphael 我们可以将多个目录位置作为 reportFiles 使用,这样它将在菜单中创建一个单一条目,并将所有添加的报告文件作为选项卡。链接 - Chathuranga Abeyrathna

1
我已经尝试了以下简单的方法。
stage('Test-Junit') {
        steps {
            sh 'gradle test'
        }
        post {
            always {
                script {
                    def moduleNames = ["app", "core", ...]
                    for(i=0; i<moduleNames.size(); i++ ) {
                        publishHTML target: [
                            allowMissing:false,
                            alwaysLinkToLastBuild: false,
                            keepAll:true,
                            reportDir: moduleNames[i] + '/build/reports/tests/test',
                            reportFiles: 'index.html',
                            reportName: 'Test Report:' + moduleNames[i]
                        ]
                    }
                }   
            }
        }
    }

它将使所有模块报告,因此您可以在项目仪表板的左侧导航栏中找到它们。

0

虽然场景不完全相同,但我决定发布我的代码,因为确实很难理解、澄清并获得文档和准确的示例,以便使用Jenkins的publishHTML插件发布多个报告到一个最终的合并报告中。

一些背景:我们执行不同的测试套件,但有些测试用例不能同时运行,因为它们可能互相干扰,所以我们需要在两个不同的时间框架内从同一段代码中执行,这是因为我们并行运行测试用例。

解决方案是按标签执行,因此一旦使用Jenkins DSL-Pipeline进行不同的执行,构建就会生成一个仅带有不同选项卡的报告。

因此,这是最终适用于我的代码:

pipeline {
    agent any
   
    stages {        
        stage('Git') {
            steps {
                git .....
            }
        }
        
        stage('Exec-1') {
            steps {
                bat 'mvn -B clean verify -Dcucumber.filter.tags=@exec1 -Dserenity.outputDirectory=reports/site/serenity/exec1'
        }

        stage('Exec-2') {
            steps {
                bat 'mvn -B clean verify -Dcucumber.filter.tags=@exec2 -Dserenity.outputDirectory=reports/site/serenity/exec2'
            }
        }
        
        stage('Exec-3') {
            steps {
                bat 'mvn -B clean verify -Dcucumber.filter.tags=@exec3 -Dserenity.outputDirectory=reports/site/serenity/exec3'
            }
        }
    }

    post {
        always {  
            publishHTML target: [
                reportName: 'Test',
                reportDir: 'reports/site/serenity',
                reportFiles: 'exec1/index.html, exec2/index.html, exec3/index.html', 
                reportTitles: 'Exec-1, Exec-2, Exec-3', 
                keepAll: true,
                alwaysLinkToLastBuild: true,
                allowMissing: false
            ]  
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接