jmeter Jenkins Pipeline发布html报告

3duebb1j  于 2022-11-09  发布在  Jenkins
关注(0)|答案(4)|浏览(241)

Maven全新安装在以下位置生成新的html文件
/var/lib/jenkins/workspace/Docs_LoadTest/target/jmeter/reports/DocsJmeterTests_20170601_151330/index.html
这里“DocsJmeterTests_20170601_151330”将在每次运行时更改。因此,我尝试使用发布html报告插件发布html报告。以下是我的管道脚本

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]在建置层级归档/var/lib/jenkins/workspace/Docs_LoadTest/目的/jmeter/reports/* 至/var/lib/jenkins/jobs/Docs_Pipeline/建置/10/html报告/Docs_Loadtest_ Jmeter 板
错误:指定的HTML目录“/var/lib/jenkins/workspace/Docs_LoadTest/target/jmeter/reports/”不存在。
即使我们尝试了以下选项也没有效果
/var/lib/jenkins/工作区/Docs_LoadTest/目标/jmeter/报告/**// /var/lib/jenkins/工作区/Docs_LoadTest/目标/jmeter/报告/DocsJmeterTests_
/var/lib/jenkins/工作区/Docs_LoadTest/目标/jmeter/报告/DocsJmeterTests_* _*

wqlqzqxt

wqlqzqxt1#

HTML Publisher plugin似乎不理解通配符。你可以在你的流水线中使用Linux的copy命令,因为它可以和通配符一起工作。
这会将[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之外的其他从属服务器上执行,也可以正常工作。这需要Copy Artifacts plugin
假设Docs_LoadTest是自由式工作:
1.添加一个Execute Shell构建步骤,将结果复制到固定文件夹,例如jmeter_results
mkdir -p target/jmeter_results/ cp -r target/jmeter/reports/*/. target/jmeter_results/
1.然后,添加一个“归档对象生成后归档步骤”,其中包含以下要归档的文件:
target/jmeter_results/*
在您的渠道中:
1.使用“复制人工因素”步骤,将档案复制到本机工作区中的target/jmeter_results文件夹:
step ([$class: 'CopyArtifact', projectName: 'Docs_LoadTest', filter: 'target/jmeter_results/*']);
1.更改对HTML发布程序的调用以使用此文件夹:
publishHTML([allowMissing: false, alwaysLinkToLastBuild: true, keepAll: true, reportDir: 'target/jmeter_results', reportFiles: 'index.html', reportName: 'Docs Loadtest Dashboard' ])

wsxa1bj1

wsxa1bj12#

我也有类似的问题,只是我想发布多个报告。
我最后做的是添加简单的groovy脚本来迭代reports目录中的文件。您可以使用相同/相似的方法来获取文件名。

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]
                    ]
                }                   
            }           
        }
    }

注:本例是在声明性pipeline.docs中使用的关于readFile函数。

ycggw6v2

ycggw6v23#

我已经简单地尝试了以下方法。

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]
                        ]
                    }
                }   
            }
        }
    }

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

nnsrf1az

nnsrf1az4#

这并不是完全相同的场景,但我决定发布我的代码,因为使用Jenkins的publishHTML插件,很难理解、澄清和获得有关如何在一个最终合并报表中发布不同报表的文档和准确示例。
作为一点背景知识,我们正在执行不同的测试包,但是一些测试用例不能一起运行,因为它们可能会互相杀死,所以我们需要在两个不同的时间框架内从相同的代码中执行,因为我们并行运行测试用例。
解决方案是按标签执行,因此,一旦使用Jenkins DSL管道执行不同的操作,构建只会生成一个报告,其中包含不同的选项卡。
这是最后一段代码:

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
            ]  
        }
    }
}

相关问题