尝试使用 readFile() 时 Jenkins Groovy 错误 groovy.lang.MissingMethodException
Jenkins Groovy error groovy.lang.MissingMethodException when trying to use readFile()
我在 Jenkins 中尝试 运行 共享库中的 readFile() 时遇到一个奇怪的错误,这样我就可以确定 Dockerfile 是从 ECR 还是从 docker hub 中提取的.错误是:-
hudson.remoting.ProxyException: groovy.lang.MissingMethodException: No signature of method: org.myorg.DockerManager.readFile() is applicable for argument types: (java.lang.String) values: [DockerServiceDescription/Dockerfile]
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:58)
at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:54)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
at com.cloudbees.groovy.cps.sandbox.DefaultInvoker.methodCall(DefaultInvoker.java:20)
at org.proj.DockerManager.login(/tmp/persistence/jobs/PROJ/jobs/builds/jobs/proj-subproj/branches/PROJ-4190/builds/47/libs/Global/src/org/me/DockerManager.groovy:26)
触发错误的方法是:-
/**
Login to docker
*/
void login() {
dockerfileHandle = readFile(dockerfile)
dockerfileLines = dockerfileHandle.readLines()
def dockerfileFROM = dockerfileLines.find{ dockerfileLine-> dockerfileLine =~ /^FROM / }
println("FROM: " + dockerfileFROM)
if (dockerfileFROM =~ /\.ecr\./ ) {
println("Using ECR")
ecrlogin()
} else {
println("Using DOCKER HUB")
dockerhublogin()
}
}
然而,相同的代码在管道代码中运行得非常好,它只是在移动到共享库时中断。
有什么想法吗?
通过代表 运行 管道的 CPSScript 实例访问管道步骤。要在 class 共享库中使用它,您必须将 this
作为构造函数或方法参数传递到您的库中:
/**
Login to docker
*/
void login(def script) { // actually CPSScript, but that way, no import is needed
dockerfileHandle = script.readFile(dockerfile)
//...
}
这来自您实际的 Jenkins 文件,然后您可以这样称呼它:
myInstance.login(this)
另请注意,您的 println
调用会在 Jenkins 日志而非构建日志中产生输出,您的目标是 script.echo()
我在 Jenkins 中尝试 运行 共享库中的 readFile() 时遇到一个奇怪的错误,这样我就可以确定 Dockerfile 是从 ECR 还是从 docker hub 中提取的.错误是:-
hudson.remoting.ProxyException: groovy.lang.MissingMethodException: No signature of method: org.myorg.DockerManager.readFile() is applicable for argument types: (java.lang.String) values: [DockerServiceDescription/Dockerfile]
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:58)
at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:54)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
at com.cloudbees.groovy.cps.sandbox.DefaultInvoker.methodCall(DefaultInvoker.java:20)
at org.proj.DockerManager.login(/tmp/persistence/jobs/PROJ/jobs/builds/jobs/proj-subproj/branches/PROJ-4190/builds/47/libs/Global/src/org/me/DockerManager.groovy:26)
触发错误的方法是:-
/**
Login to docker
*/
void login() {
dockerfileHandle = readFile(dockerfile)
dockerfileLines = dockerfileHandle.readLines()
def dockerfileFROM = dockerfileLines.find{ dockerfileLine-> dockerfileLine =~ /^FROM / }
println("FROM: " + dockerfileFROM)
if (dockerfileFROM =~ /\.ecr\./ ) {
println("Using ECR")
ecrlogin()
} else {
println("Using DOCKER HUB")
dockerhublogin()
}
}
然而,相同的代码在管道代码中运行得非常好,它只是在移动到共享库时中断。
有什么想法吗?
通过代表 运行 管道的 CPSScript 实例访问管道步骤。要在 class 共享库中使用它,您必须将 this
作为构造函数或方法参数传递到您的库中:
/**
Login to docker
*/
void login(def script) { // actually CPSScript, but that way, no import is needed
dockerfileHandle = script.readFile(dockerfile)
//...
}
这来自您实际的 Jenkins 文件,然后您可以这样称呼它:
myInstance.login(this)
另请注意,您的 println
调用会在 Jenkins 日志而非构建日志中产生输出,您的目标是 script.echo()