在课程生成期间,Jenkins管道脚本失败并显示"常规错误:方法代码太大!"

时间:2016-10-14 18:33:22

标签: jenkins jenkins-pipeline

运行大型Jenkins管道脚本时,它可以提供错误:

  

org.codehaus.groovy.control.MultipleCompilationErrorsException:startup failed:类生成期间的常规错误:方法代码太大了!

     

java.lang.RuntimeException:方法代码太大了!

出现此错误的原因是什么?如何解决?

2 个答案:

答案 0 :(得分:2)

这是由于Java和Groovy之间的限制,要求方法字节码不大于64kb。这不是由于Jenkins Pipeline DSL。

要解决此问题,请将其分解为方法并调用方法,而不是使用单个整体管道脚本。

例如,而不是:

stage foo
parallel([
 ... giant list of maps ...
])

取而代之的是:

stage foo
def build_foo() {
  parallel([
     ...giant list of maps...
  ])}
build_foo()

答案 1 :(得分:1)

如果您将声明性管道与共享库一起使用,则可能需要在新方法中重构和外部化全局变量。这是一个完整的示例:

Jenkinsfile:

@Library("my-shared-library") _
myPipeline()

myPipeline.groovy:

def call() {
    String SOME_GLOBAL_VARIABLE
    String SOME_GLOBAL_FILENAME
    pipeline {
        stages() {
            stage('stage 1') {
                steps {
                    script {
                        SOME_GLOBAL_VARIABLE = 'hello'
                        SOME_GLOBAL_FILENAME = 'hello.txt'
                        ...
                    }
                }
            }
            stage('stage 2') {
                steps {
                    script {
                        doSomething(fileContent: SOME_GLOBAL_VARIABLE, filename: SOME_GLOBAL_FILENAME)
                        sh "cat $SOME_GLOBAL_FILENAME"
                    }
                }
            }
        }
    }
}
def doSomething(Map params) {
    String fileContent = params.fileContent
    String filename = params.filename
    sh "echo $fileContent > $filename"
}