Jenkinsfile:java.lang.RuntimeException:方法代码太大
Jenkinsfile : java.lang.RuntimeException: Method code too large
我在 jenkisnfile 中有 790 行的 Jenkins 管道代码。我收到以下错误消息 Method code too large
11:05:24 org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
11:05:24 General error during class generation: Method code too large!
11:05:24
11:05:24 java.lang.RuntimeException: Method code too large!
11:05:24 at groovyjarjarasm.asm.MethodWriter.a(Unknown Source)
11:05:24 at groovyjarjarasm.asm.ClassWriter.toByteArray(Unknown Source)
11:05:24 at org.codehaus.groovy.control.CompilationUnit.call(CompilationUnit.java:827)
11:05:24 at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1065)
11:05:24 at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:603)
11:05:24 at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:581)
11:05:24 at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:558)
11:05:24 at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:298)
11:05:24 at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:268)
11:05:24 at groovy.lang.GroovyShell.parseClass(GroovyShell.java:688)
11:05:24 at groovy.lang.GroovyShell.parse(GroovyShell.java:700)
11:05:24 at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.doParse(CpsGroovyShell.java:142)
11:05:24 at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.reparse(CpsGroovyShell.java:127)
11:05:24 at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.parseScript(CpsFlowExecution.java:571)
11:05:24 at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.start(CpsFlowExecution.java:523)
11:05:24 at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java:337)
11:05:24 at hudson.model.ResourceController.execute(ResourceController.java:97)
11:05:24 at hudson.model.Executor.run(Executor.java:429)
11:05:24
11:05:24 1 error
11:05:24
11:05:24 at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:310)
11:05:24 at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1085)
11:05:24 at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:603)
11:05:24 at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:581)
11:05:24 at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:558)
11:05:24 at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:298)
11:05:24 at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:268)
11:05:24 at groovy.lang.GroovyShell.parseClass(GroovyShell.java:688)
11:05:24 at groovy.lang.GroovyShell.parse(GroovyShell.java:700)
11:05:24 at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.doParse(CpsGroovyShell.java:142)
11:05:24 at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.reparse(CpsGroovyShell.java:127)
11:05:24 at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.parseScript(CpsFlowExecution.java:571)
11:05:24 at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.start(CpsFlowExecution.java:523)
11:05:24 at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java:337)
11:05:24 at hudson.model.ResourceController.execute(ResourceController.java:97)
11:05:24 at hudson.model.Executor.run(Executor.java:429)
11:05:24 Finished: FAILURE
使用以下版本
OS : Ubuntu 18.04.1
詹金斯:2.263.4
Java : 1.8.0_181
(主从)
在 /etc/default/jenkins
( Master )
中设置 JAVA_ARGS="-Xmx2048m"
我该如何解决这个问题?
Java 字节码的大小限制为 64K。这不是詹金斯的问题。要解决这个问题,您应该将管道分解为方法。有一个很好的例子 here。
是的,这是一个限制,您必须使用共享库/将它们分成多个方法来解决这个问题。
共享库参考:
https://www.jenkins.io/doc/book/pipeline/shared-libraries/
解决方案: 使用你的 jenkinsfile 来定义阶段,所有 methods/functionalities 都在共享库中实现,共享库只会从你的 jenkinsfile 中调用。
示例实现如下所示。
创建一个名为:sharedlibraries(groovy 文件)
的文件
#!groovy
// Write or add Functions(definitions of stages) which will be called from your jenkins file
def Create_AMI(PROJECT_NAME, ENV_NAME)
{
echo ENV_NAME
sh "packer build jenkins/${PROJECT_NAME}/${PROJECT_NAME}-ami.json"
// You can also set the environment below example:
env.ENV_NAME ="dev"
}
return this
在您的 Jenkinsfile 中写入以下代码:
// Global variable is used to get data from groovy file(shared library)
def stagelibrary
stage('Create New AMI') {
steps {
script {
// Load Shared library Groovy file stagelibraries.Give your path of stagelibraries file whic is created
stagelibrary = load 'C:\Jenkins\stagelibraries'
// Execute Create_AMI function. You can add if else conditions over here, based on your branches. But am not sure of your conditions.
// You can also pass your environment variable
// in the Crete_AMI function using env.<YOURENVVARIABLE>
stagelibrary.Create_AMI(PROJECT_NAME,env.ENV_NAME)
}
}
}
这只是一个示例,用于向您展示如何将您的功能划分为共享库,并且不会给您带来与代码限制相关的错误。
我在 jenkisnfile 中有 790 行的 Jenkins 管道代码。我收到以下错误消息 Method code too large
11:05:24 org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
11:05:24 General error during class generation: Method code too large!
11:05:24
11:05:24 java.lang.RuntimeException: Method code too large!
11:05:24 at groovyjarjarasm.asm.MethodWriter.a(Unknown Source)
11:05:24 at groovyjarjarasm.asm.ClassWriter.toByteArray(Unknown Source)
11:05:24 at org.codehaus.groovy.control.CompilationUnit.call(CompilationUnit.java:827)
11:05:24 at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1065)
11:05:24 at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:603)
11:05:24 at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:581)
11:05:24 at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:558)
11:05:24 at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:298)
11:05:24 at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:268)
11:05:24 at groovy.lang.GroovyShell.parseClass(GroovyShell.java:688)
11:05:24 at groovy.lang.GroovyShell.parse(GroovyShell.java:700)
11:05:24 at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.doParse(CpsGroovyShell.java:142)
11:05:24 at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.reparse(CpsGroovyShell.java:127)
11:05:24 at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.parseScript(CpsFlowExecution.java:571)
11:05:24 at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.start(CpsFlowExecution.java:523)
11:05:24 at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java:337)
11:05:24 at hudson.model.ResourceController.execute(ResourceController.java:97)
11:05:24 at hudson.model.Executor.run(Executor.java:429)
11:05:24
11:05:24 1 error
11:05:24
11:05:24 at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:310)
11:05:24 at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1085)
11:05:24 at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:603)
11:05:24 at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:581)
11:05:24 at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:558)
11:05:24 at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:298)
11:05:24 at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:268)
11:05:24 at groovy.lang.GroovyShell.parseClass(GroovyShell.java:688)
11:05:24 at groovy.lang.GroovyShell.parse(GroovyShell.java:700)
11:05:24 at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.doParse(CpsGroovyShell.java:142)
11:05:24 at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.reparse(CpsGroovyShell.java:127)
11:05:24 at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.parseScript(CpsFlowExecution.java:571)
11:05:24 at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.start(CpsFlowExecution.java:523)
11:05:24 at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java:337)
11:05:24 at hudson.model.ResourceController.execute(ResourceController.java:97)
11:05:24 at hudson.model.Executor.run(Executor.java:429)
11:05:24 Finished: FAILURE
使用以下版本
OS : Ubuntu 18.04.1
詹金斯:2.263.4
Java : 1.8.0_181
(主从)
在 /etc/default/jenkins
( Master )
JAVA_ARGS="-Xmx2048m"
我该如何解决这个问题?
Java 字节码的大小限制为 64K。这不是詹金斯的问题。要解决这个问题,您应该将管道分解为方法。有一个很好的例子 here。
是的,这是一个限制,您必须使用共享库/将它们分成多个方法来解决这个问题。
共享库参考:
https://www.jenkins.io/doc/book/pipeline/shared-libraries/
解决方案: 使用你的 jenkinsfile 来定义阶段,所有 methods/functionalities 都在共享库中实现,共享库只会从你的 jenkinsfile 中调用。
示例实现如下所示。 创建一个名为:sharedlibraries(groovy 文件)
的文件#!groovy
// Write or add Functions(definitions of stages) which will be called from your jenkins file
def Create_AMI(PROJECT_NAME, ENV_NAME)
{
echo ENV_NAME
sh "packer build jenkins/${PROJECT_NAME}/${PROJECT_NAME}-ami.json"
// You can also set the environment below example:
env.ENV_NAME ="dev"
}
return this
在您的 Jenkinsfile 中写入以下代码:
// Global variable is used to get data from groovy file(shared library)
def stagelibrary
stage('Create New AMI') {
steps {
script {
// Load Shared library Groovy file stagelibraries.Give your path of stagelibraries file whic is created
stagelibrary = load 'C:\Jenkins\stagelibraries'
// Execute Create_AMI function. You can add if else conditions over here, based on your branches. But am not sure of your conditions.
// You can also pass your environment variable
// in the Crete_AMI function using env.<YOURENVVARIABLE>
stagelibrary.Create_AMI(PROJECT_NAME,env.ENV_NAME)
}
}
}
这只是一个示例,用于向您展示如何将您的功能划分为共享库,并且不会给您带来与代码限制相关的错误。