簡體   English   中英

Jenkins 管道:沒有這種 DSL 方法

[英]Jenkins pipeline: No such DSL method

使用此代碼,我在 Jenkins 管道中遇到錯誤。 我不明白為什么? 我錯過了什么嗎?

node {
   stage 'test'
   def whatThe = someFunc('textToFunc')
   {def whatThe2 = someFunc2('textToFunc2')}
}


def someFunc(String text){
    echo text
    text
}
def someFunc2(String text2){
    echo text2
    text2
}

錯誤:

java.lang.NoSuchMethodError: **No such DSL method 'someFunc'** found among [archive, bat, build, catchError, checkout, deleteDir, dir, echo, emailext, emailextrecipients, error, fileExists, git, input, isUnix, load, mail, node, parallel, properties, pwd, readFile, readTrusted, retry, sh, sleep, stage, stash, step, svn, timeout, timestamps, tool, unarchive, unstash, waitUntil, withCredentials, withEnv, wrap, writeFile, ws]
        at org.jenkinsci.plugins.workflow.cps.DSL.invokeMethod(DSL.java:124)
        at org.jenkinsci.plugins.workflow.cps.CpsScript.invokeMethod(CpsScript.java:117)
        at groovy.lang.MetaClassImpl.invokeMethodOnGroovyObject(MetaClassImpl.java:1280)
        at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1174)
        at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1024)
        at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:42)
        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:15)
        at WorkflowScript.run(WorkflowScript:4)
        at ___cps.transform___(Native Method)
        at com.cloudbees.groovy.cps.impl.ContinuationGroup.methodCall(ContinuationGroup.java:55)
        at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.dispatchOrArg(FunctionCallBlock.java:106)
        at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.fixArg(FunctionCallBlock.java:79)
        at sun.reflect.GeneratedMethodAccessor878.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.ClosureBlock.eval(ClosureBlock.java:40)
        at com.cloudbees.groovy.cps.Next.step(Next.java:58)
        at com.cloudbees.groovy.cps.Continuable.run0(Continuable.java:154)
        at org.jenkinsci.plugins.workflow.cps.CpsThread.runNextChunk(CpsThread.java:164)
        at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:360)
        at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$100(CpsThreadGroup.java:80)
        at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:236)
        at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:226)
        at org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$2.call(CpsVmExecutorService.java:47)
        at java.util.concurrent.FutureTask.run(Unknown Source)
        at hudson.remoting.SingleLaneExecutorService$1.run(SingleLaneExecutorService.java:112)
        at jenkins.util.ContextResettingExecutorService$1.run(ContextResettingExecutorService.java:28)
        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)
    Finished: FAILURE

sumfunc2調用周圍刪除額外的括號:

node {
   stage 'test'
   def whatThe = someFunc('textToFunc')
   def whatThe2 = someFunc2('textToFunc2')
}

def someFunc(String text){
    echo text
    text
}
def someFunc2(String text2){
    echo text2
    text2
}

更新:

在 Groovy 中,如果方法的最后一個參數是閉包類型,那么在調用該方法時,閉包可以在括號之外,例如:

def foo(whatever, Closure c) {}

// Can be invoked as
foo(whatever, {
    // This is the second argument of foo of type Closure
})

// It is also the same as writing
foo(whatever) {
    // This is the second argument of foo of type Closure
}

原來拋出的原因是因為下面的代碼

def whatThe = someFunc('textToFunc')
{def whatThe2 = someFunc2('textToFunc2')}

是相同的代碼

def whatThe = someFunc('textToFunc') {
    def whatThe2 = someFunc2('textToFunc2')
}

這意味着口譯員將尋找的是

someFunc(String text, Closure c)

並且沒有這樣的方法

由於這個答案是我在查找“No such DSL method”消息時找到的第一個答案,我想補充一點,它也可能是不匹配的接口。 在我的例子中,第一個參數是一個列表,但我試圖用數組調用該方法。 因此,請檢查您的界面是否符合您的預期,並且您的參數是否正確傳遞。

就我而言,發生的事情是我正在使用: ${} 引用一個變量,該變量正在擴展為空字符串:

env.VAR1=${VAR2}

就我而言,var2 並不真正存在,所以我實際上要做的是:

env.VAR1=env.VAR2

從我的最后愚蠢的錯誤。

您可能還忘記了包含您的庫...

IE

@Library('shared-library') _

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM