运行大型Jenkins管道脚本时,它可以提供错误:
org.codehaus.groovy.control.MultipleCompilationErrorsException:startup failed:类生成期间的常规错误:方法代码太大了!
java.lang.RuntimeException:方法代码太大了!
出现此错误的原因是什么?如何解决?
答案 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"
}