Jenkins 未找到此类字段:访问cppcheck插件类时字段java.lang.String输入错误

Jenkins 未找到此类字段:访问cppcheck插件类时字段java.lang.String输入错误,jenkins,groovy,jenkins-pipeline,Jenkins,Groovy,Jenkins Pipeline,]我是一名试图了解詹金斯的初级开发人员,我已经自学了几个月了。目前我有一个管道(仅用于学习目的),它在文件夹上运行静态分析,然后发布,我已经能够使用jelly模板通过电子邮件发送报告,从那时起,我意识到可以实例化插件的类来使用它的方法,所以我去了cppcheck,做了一些尝试和错误,这样我可以得到我报告的一些值,然后用它们做一些其他的事情,所以我在管道中做了类似的事情: pipeline { agent any stages { stage('analysis'

]我是一名试图了解詹金斯的初级开发人员,我已经自学了几个月了。目前我有一个管道(仅用于学习目的),它在文件夹上运行静态分析,然后发布,我已经能够使用jelly模板通过电子邮件发送报告,从那时起,我意识到可以实例化插件的类来使用它的方法,所以我去了cppcheck,做了一些尝试和错误,这样我可以得到我报告的一些值,然后用它们做一些其他的事情,所以我在管道中做了类似的事情:

pipeline {
    agent any

    stages {
        stage('analysis') {
            steps {
                script{
                    bat'cppcheck "E:/My_project/Source/"  --xml --xml-version=2 . 2> cppcheck.xml'
                }

            }
        }
        
        stage('Test'){
            steps {
                script {
                    publishCppcheck pattern:'cppcheck.xml'
                    
                    for (action in currentBuild.rawBuild.getActions()) {
                        def name = action.getClass().getName()
                        if (name == 'org.jenkinsci.plugins.cppcheck.CppcheckBuildAction') {
                            def cppcheckaction = action
                            def totalErrors = cppcheckaction.getResult().report.getNumberTotal()
                            println totalErrors
                            def warnings = cppcheckaction.getResult().statistics.getNumberWarningSeverity()
                            println warnings
                        }
                    }
                }   
            }
        }
   
    }

}

def nueva = cppcheckaction.getResult().diffState.valueOf(NEW)
println nueva
哪个输出是:

[Pipeline] echo
102
[Pipeline] echo
4
我的逻辑(错误地)告诉我,如果我可以访问
报表
统计
类,并分别使用它们的方法
getNumberTotal()
getNumberWarningSeverity()
,因此,我也应该能够以相同的方式访问
DiffState
类,并使用
valueOf()
方法获取新错误的枚举。但将此添加到我的管道中:

pipeline {
    agent any

    stages {
        stage('analysis') {
            steps {
                script{
                    bat'cppcheck "E:/My_project/Source/"  --xml --xml-version=2 . 2> cppcheck.xml'
                }

            }
        }
        
        stage('Test'){
            steps {
                script {
                    publishCppcheck pattern:'cppcheck.xml'
                    
                    for (action in currentBuild.rawBuild.getActions()) {
                        def name = action.getClass().getName()
                        if (name == 'org.jenkinsci.plugins.cppcheck.CppcheckBuildAction') {
                            def cppcheckaction = action
                            def totalErrors = cppcheckaction.getResult().report.getNumberTotal()
                            println totalErrors
                            def warnings = cppcheckaction.getResult().statistics.getNumberWarningSeverity()
                            println warnings
                        }
                    }
                }   
            }
        }
   
    }

}

def nueva = cppcheckaction.getResult().diffState.valueOf(NEW)
println nueva
给我一个错误:

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: No such field found: field org.jenkinsci.plugins.cppcheck.CppcheckBuildAction diffState
    at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.unclassifiedField(SandboxInterceptor.java:425)
    at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onGetProperty(SandboxInterceptor.java:409)
...
我可以在中看到,有一个
diffState
类带有
valueOf()
方法,但是我无法访问它。是否有其他方法可以获取上一次生成和当前生成之间的新错误?

我发现有两个问题可能导致这种情况:

  • CppcheckResult
    没有成员变量
    diffState
    ,因此您无法访问它
  • 如果您检查该类的javadoc是否具有:

    private CppcheckReport report;
    public CppcheckStatistics getReport()
    

    diffState
    没有成员(和getter方法),因此可以尝试调用:

    /**
     * Get differences between current and previous statistics.
     * 
     * @return the differences
     */
    public CppcheckStatistics getDiff(){
    
    我的建议:
    cppcheckaction.getResult().getDiff().valueOf(新)
    。此外,它还有一个方法
    getDiffState()


  • 请查看Jenkins的脚本批准(请参阅)
  • 出现语法错误可能是因为Jenkins(Groovy Sandbox)阻止了(对于Jenkins)“未知”和潜在危险方法的执行


    Jenkins settings-Script Approval-Approve您被阻止的方法

    thx用于回答,我之前已经尝试了
    cppcheckaction.getResult().getDiff().valueOf(NEW)
    ,我得到了
    groovy.lang.MissingPropertyException:没有这样的属性:新的类:groovy.lang.Binding
    ,关于脚本批准,我也这样做了,因为其他方法也需要一些批准。我一直在检查
    CppcheckWorkspaceFile
    ,但由于我从未使用过Java,而且没有什么经验,我不知道如何在管道中访问它……您能举一个示例,说明管道中
    getDiffState
    的stntax是如何使用的吗?提前感谢,我还用我在javadoc中看到的
    CppcheckDiffState
    类和
    valueOf()
    方法的图像更新了主要问题