Сценарий конвейера Jenkins завершается с ошибкой "Общая ошибка при генерации класса: код метода слишком велик!"
При запуске большого конвейерного скрипта Jenkins может выдать ошибку:
org.codehaus.groovy.control.MultipleCompilationErrorsException: сбой запуска: общая ошибка при генерации класса: слишком большой код метода!
java.lang.RuntimeException: код метода слишком велик!
В чем причина этой ошибки и как ее можно исправить?
1 ответ
Это связано с ограничением между Java и Groovy, требующим, чтобы байт-код метода не превышал 64 КБ. Это не связано с трубопроводом Дженкинс DSL.
Чтобы решить эту проблему, вместо использования одного монолитного конвейерного сценария, разбейте его на методы и вызовите методы.
Например, вместо того, чтобы:
stage foo
parallel([
... giant list of maps ...
])
Вместо этого сделайте:
stage foo
def build_foo() {
parallel([
...giant list of maps...
])}
build_foo()
Если вы используете декларативный конвейер с общей библиотекой, вам может потребоваться рефакторинг и экстернализация глобальных переменных в новых методах. Вот полный пример:
Файл Jenkins:
@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"
}