Jenkins Groovy Script finding null testResultAction for a successful run

我的梦境 提交于 2019-12-10 21:08:35

问题


We have an email report writer for test suites on jenkins. It uses a groovy script to find the correct reports and then make an HTML report detailing the test status, last time ran, links etc.

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")
                    }

                    ...
                }
            }
        }
    }
}

Usually everything runs fine, but recently one or two specific builds have started to be returned consistently as "No results" i.e. their .testResultAction is null. I've checked the actual value for testResultAction, and it is indeed a null, despite them running a clean test that Jenkins itself recognises as such.

The tests have been re-ran, and the jenkins build deleted and remade; neither helped. This problem seems to be haunting certain, unrelated, builds. Is there a particular flaw in Jenkins here that I should know about that causes the testResultAction to default to null and not change? Otherwise, can anyone suggest what might be causing this to happen, or how I can stop it?


回答1:


That method is deprecated and was giving me null too. I had more success with this:

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

Though it can be null just because there are no tests in the project. Anyway, here's a method for testing the results, which works for me.

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")
            }
        }
    }
}


来源:https://stackoverflow.com/questions/26628876/jenkins-groovy-script-finding-null-testresultaction-for-a-successful-run

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!