尝试使用 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()