Jenkins共享库中的Groovy作用域

Jenkins共享库中的Groovy作用域,jenkins,groovy,jenkins-pipeline,perforce,Jenkins,Groovy,Jenkins Pipeline,Perforce,我目前正在将Jenkins管道从一个管道项目重构为一个多分支管道项目,并尝试使一些功能更加模块化,并尝试将更多代码迁移到一个共享管道项目。但是,这会导致编译错误,感觉与groovy作用域有关,在调用第三方库时,groovy尝试使用与函数相同的作用域,而不是使用全局作用域 原始函数位于我的脚本管道文件中,如下所示: def bootstrapPythonEnvironment( String client, String credentials, String label = "#head" )

我目前正在将Jenkins管道从一个管道项目重构为一个多分支管道项目,并尝试使一些功能更加模块化,并尝试将更多代码迁移到一个共享管道项目。但是,这会导致编译错误,感觉与groovy作用域有关,在调用第三方库时,groovy尝试使用与函数相同的作用域,而不是使用全局作用域

原始函数位于我的脚本管道文件中,如下所示:

def bootstrapPythonEnvironment( String client, String credentials, String label = "#head" ) {
        String bootstrapWorkspace = "${client}_BootstrapWorkspace"
        def p4 = p4(credential: credentials,
            workspace: manualSpec(
                charset: 'winansi',
                name: bootstrapWorkspace,
                spec: clientSpec(
                    view: "//MyGameContent/BuildScripts/Python/... //${bootstrapWorkspace}/BootstrapScripts/..." )
            ))
        p4.run('sync', "//MyGameContent/...", label)
}
但是,当将其从Jenkins文件移动到:vars/BuildTools.groovy时 我称之为:
BuildTools.bootstrapJenkinsEnvironment(env.MyClient,'CSSBuildmachine','head')
然后我得到以下错误:

hudson.remoting.ProxyException: groovy.lang.MissingMethodException: No signature of method: static BuildTools.bootstrapPythonEnvironment() is applicable for argument types: (java.lang.String, java.lang.String, java.lang.String) values: [jenkins-Stekdatorn-TestWorkspace-null-0, CSSBuildmachine, ...]
Possible solutions: bootstrapPythonEnvironment(java.lang.String, java.lang.String, java.lang.String), bootstrapPythonEnvironment(java.lang.String, java.lang.String)
因此,我将函数声明更改为incluide static:
static def bootstrapPythonEnvironment(字符串客户端、字符串凭据、字符串标签=“#头”)
这有点帮助,但现在我得到的错误是:

hudson.remoting.ProxyException: groovy.lang.MissingMethodException: No signature of method: static BuildTools.clientSpec() is applicable for argument types: (java.util.LinkedHashMap) values: [[view://MyGameContent/BuildScripts/Python/... //jenkins-Stekdatorn-TestWorkspace-null-0_BootstrapWorkspace/BootstrapScripts/...]]
    at groovy.lang.MetaClassImpl.invokeStaticMissingMethod(MetaClassImpl.java:1501)
    at groovy.lang.MetaClassImpl.invokeStaticMethod(MetaClassImpl.java:1487)
    at org.codehaus.groovy.runtime.callsite.StaticMetaClassSite.call(StaticMetaClassSite.java:53)
    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 BuildTools.bootstrapPythonEnvironment(BuildTools.groovy:11)
    at WorkflowScript.run(WorkflowScript:18)
    at ___cps.transform___(Native Method)
    at com.cloudbees.groovy.cps.impl.ContinuationGroup.methodCall(ContinuationGroup.java:84)
    at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.dispatchOrArg(FunctionCallBlock.java:113)
    at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.fixArg(FunctionCallBlock.java:83)
    at sun.reflect.GeneratedMethodAccessor324.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.cloudbees.groovy.cps.impl.ContinuationPtr$ContinuationImpl.receive(ContinuationPtr.java:72)
    at com.cloudbees.groovy.cps.impl.CollectionLiteralBlock$ContinuationImpl.dispatch(CollectionLiteralBlock.java:55)
    at com.cloudbees.groovy.cps.impl.CollectionLiteralBlock$ContinuationImpl.item(CollectionLiteralBlock.java:45)
    at sun.reflect.GeneratedMethodAccessor320.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.cloudbees.groovy.cps.impl.ContinuationPtr$ContinuationImpl.receive(ContinuationPtr.java:72)
    at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.dispatchOrArg(FunctionCallBlock.java:107)
    at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.fixArg(FunctionCallBlock.java:83)
    at sun.reflect.GeneratedMethodAccessor324.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.cloudbees.groovy.cps.impl.ContinuationPtr$ContinuationImpl.receive(ContinuationPtr.java:72)
    at com.cloudbees.groovy.cps.impl.ContinuationGroup.methodCall(ContinuationGroup.java:87)
    at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.dispatchOrArg(FunctionCallBlock.java:113)
    at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.fixArg(FunctionCallBlock.java:83)
    at sun.reflect.GeneratedMethodAccessor324.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.cloudbees.groovy.cps.impl.ContinuationPtr$ContinuationImpl.receive(ContinuationPtr.java:72)
    at com.cloudbees.groovy.cps.impl.ConstantBlock.eval(ConstantBlock.java:21)
    at com.cloudbees.groovy.cps.Next.step(Next.java:83)
    at com.cloudbees.groovy.cps.Continuable$1.call(Continuable.java:174)
    at com.cloudbees.groovy.cps.Continuable$1.call(Continuable.java:163)
    at org.codehaus.groovy.runtime.GroovyCategorySupport$ThreadCategoryInfo.use(GroovyCategorySupport.java:129)
    at org.codehaus.groovy.runtime.GroovyCategorySupport.use(GroovyCategorySupport.java:268)
    at com.cloudbees.groovy.cps.Continuable.run0(Continuable.java:163)
    at org.jenkinsci.plugins.workflow.cps.CpsThread.runNextChunk(CpsThread.java:186)
    at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:370)
    at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$200(CpsThreadGroup.java:93)
    at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:282)
    at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:270)
    at org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$2.call(CpsVmExecutorService.java:66)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at hudson.remoting.SingleLaneExecutorService$1.run(SingleLaneExecutorService.java:131)
    at jenkins.util.ContextResettingExecutorService$1.run(ContextResettingExecutorService.java:28)
    at jenkins.security.ImpersonatingExecutorService$1.run(ImpersonatingExecutorService.java:59)
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
我已尝试将此文件移动到src/com/coffeestain/build/Python.groovy,并将其放在函数中:

class Python {
    static def bootstrap( String client, String credentials, String label = "#head" ) {
        // Snipped out code
    }
}
但当我尝试导入时,它只会给我一个类似的消息:

@Library('MyGameBuildtools') import com.coffeestain.build.*
并称之为:

Python.bootstrap( env.P4CLIENT, 'CSSBuildmachine', "#head" )
但是,这给了我另一种形式的相同错误:

hudson.remoting.ProxyException: groovy.lang.MissingMethodException: No signature of method: static com.coffeestain.build.Python.clientSpec() is applicable for argument types: (java.util.LinkedHashMap) values: [[view://MyGameContent/BuildScripts/Python/... //jenkins-Stekdatorn-TestWorkspace-null-0_BootstrapWorkspace/BootstrapScripts/...]]
我当前的解决方法是将其添加到文件vars/bootstrapthytonenvironment.groovy中,定义如下:

def call( String client, String credentials, String label = "#head" ) {
    // Snipped out code
}
但从长远来看,为我添加的每个函数创建一个文件是不可行的。

谢谢你帮我解决这个问题

clientSpec和P4来自

我通过将函数更改为以下方式解决了此问题,请注意上下文的使用方式:

static def bootstrapPythonEnvironment( context, String client, String credentials, String label = "#head" ) {
    String bootstrapWorkspace = "${client}_BootstrapWorkspace"
    def p4 = context.p4(credential: credentials,
        workspace: context.manualSpec(
            charset: 'winansi',
            name: bootstrapWorkspace,
            spec: context.clientSpec(
                view: "//MyGameContent/BuildScripts/Python/... //${bootstrapWorkspace}/BootstrapScripts/..." )
        ))
    p4.run('sync', "//MyGameContent/...", label)
}
我称之为:

MyGameUtils.bootstrapPythonEnvironment( this, env.P4CLIENT, 'CSSBuildmachine' )

这些东西对我来说不合适,函数
clientSpec()
从何而来?Sems在开始时也需要静态。能否添加groovy文件的完整版本(可以编辑,但函数签名和函数调用应该保持不变)?等等,这些步骤可能需要构建上下文来执行。能否尝试将参数
context
添加到库函数中,并像
context.p4([…]context.clientSpec([…])
一样使用它,并在调用库函数时用
this
填充上下文?另请参见访问步骤部分。