一尘不染

Jenkins Groovy脚本发现null testResultAction成功运行

jenkins

我们有一个电子邮件报告编写器,用于jenkins的测试套件。它使用常规脚本查找正确的报告,然后制作HTML报告,详细说明测试状态,上次运行,链接等。

hudson.model.Hudson.instance.getItems(hudson.model.FreeStyleProject).each { project ->
    if(project.name.contains(searchCriteria)){
        if(project.lastBuild.testResultAction == null){ 
            tr(){
                td(project.name)                        
                td(){
                    b("No Results")
                }
                ...
            }
        }
        else{
            if(project.lastBuild.testResultAction.failCount > 0){
                tr(){
                    td(project.name)
                    td(){
                        b(style:'color:red', "FAIL")
                    }

                    ...
                }
            }
            else{
            tr(){
                    td(project.name)
                    td(){
                        b(style:'color:red', "PASS")
                    }

                    ...
                }
            }
        }
    }
}

通常,一切运行正常,但是最近一两个特定的构建已经开始一致地返回“无结果”,即它们的.testResultAction为null。我已经检查了testResultAction的实际值,尽管它们运行了詹金斯本身可以识别的干净测试,但它的确为空。

测试已经重新运行,詹金斯人的身影被删除并重新制作。都没有帮助。这个问题似乎困扰着某些无关的构建。我应该知道Jenkins中是否存在特定缺陷,该缺陷会导致testResultAction默认为null且不会更改?否则,谁能建议可能导致这种情况发生的原因,或者我如何制止这种情况?


阅读 317

收藏
2020-07-25

共1个答案

一尘不染

该方法已弃用,并且也给了我null。我在此方面获得了更多成功:

project.lastBuild.getAction(hudson.tasks.test.AggregatedTestResultAction.class)

尽管它可以为null只是因为项目中没有测试。无论如何,这是一种测试结果的方法,对我有用。

def reportOnTestsForBuild(build) {    
    testResultAction =  build.getAction(hudson.tasks.test.AggregatedTestResultAction.class);

    if (testResultAction == null) {
        println("No tests")
        return
    }

    childReports = testResultAction.getChildReports();

    if (childReports == null || childReports.size() == 0) {
        println("No child reports")
        return
    }

    def failures = [:]
    childReports.each { report ->
        def result = report.result;

        if (result == null) {
            println("null result from child report")
        }
        else if (result.failCount < 1) {
            println("result has no failures")
        }
        else {
            println("overall fail count: ${result.failCount}")
            failedTests = result.getFailedTests();

            failedTests.each { test ->
                failures.put(test.fullDisplayName, test)
                println("Failed test: ${test.fullDisplayName}\n" +
                        "name: ${test.name}\n" +
                        "age: ${test.age}\n" +
                        "failCount: ${test.failCount}\n" +
                        "failedSince: ${test.failedSince}\n" +
                        "errorDetails: ${test.errorDetails}\n")
            }
        }
    }
}
2020-07-25