首页 文章

Jenkins Pipeline发布html报告

提问于
浏览
2

Maven clean install在以下位置生成新的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]在BUILD级别/ var / lib / jenkins / workspace / Docs_LoadTest / target / jmeter / reports / *存档到/ var / lib / jenkins / jobs / Docs_Pipeline / builds / 10 / htmlreports / Docs_Loadtest_Dashboard错误:指定的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_ * _ *

2 回答

  • 1

    HTML Publisher plugin似乎不懂通配符 . 您可以在管道中执行的操作是使用Linux的复制命令,因为它可以使用通配符 .

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

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

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

    A better solution:

    将在Docs_LoadTest中应用此技巧并使用“发布工件”和“复制工件”功能 . 这解决了必须硬编码到另一个作业的路径并且即使管道在Docs_LoadTest之外的另一个从站上执行也能工作 . 这确实需要Copy Artifacts plugin .

    假设 Docs_LoadTest 是一个自由式工作:

    • 添加 Execute Shell 构建步骤,将结果复制到固定文件夹,例如 jmeter_results

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

    • 然后添加Archive Artifacts Post Build Archive Step并将以下文件存档:

    target/jmeter_results/*

    在您的管道中:

    • 使用“复制工件”步骤将文件复制到本地工作空间中的 target/jmeter_results 文件夹:

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

    • 更改对HTML发布者的调用以使用此文件夹:

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

  • 7

    我遇到了类似的问题,只是我想发布多个报告 .

    我最后做的是我添加了简单的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功能的文档 .

相关问题