簡體   English   中英

Jenkins 共享庫遞歸 Function 調用

[英]Jenkins Shared Library Recursive Function Calls

我有聲明性管道並使用 jenkins 共享庫。 我正在嘗試在 jenkins 共享庫中進行遞歸 function 調用。

我的共享庫結構類似於以下內容:

vars/xyz.groovy

在 xyz.groovy 內部,我有方法 foo,我從我的管道中調用 xyz.foo,該方法有效。 但是來自的遞歸調用

foo(){
foo()   // says No such DSL method
xyz.foo() //says no signature of method: java.lang.class.foo
}

我試圖了解如何在 jenkins 共享庫中調用函數。

this.methodName是在共享庫中遞歸調用 function 的正確方法。 盡管方法不是 class 的一部分。 但是使用this.foo()對我有用。

I was trying something similar to invoke a recursive function with a method declared in the same file.groovy At the end, the option @Sagar gave didn't work for me As a workaround, I created the recursive function in a new file (b .groovy) 並從原始文件 (a.groovy) 調用它。 它就像一個魅力:)

例子。

b.groovy

/**
 * recursive function to compare semantic version form package.json and tag version, only evaluate x.x.x version
 * 0 same version
 * 1 package.json version is GREATER than repo tag version
 * -1 package.json version is SMALLER than repo tag version
 */
int call(ArrayList versionPackageJsonSplit, ArrayList versionTagRepoSplit, Integer iteration) {
    if (versionPackageJsonSplit[iteration].toInteger() == versionTagRepoSplit[iteration].toInteger()) {
        if (iteration == 2) {
            println 'return 0'
            return 0
        }
        return utility_cdkCompareVersions (versionPackageJsonSplit, versionTagRepoSplit, iteration+1) // --> recursive invocation
    } else if (versionPackageJsonSplit[iteration].toInteger() > versionTagRepoSplit[iteration].toInteger()) {
        println 'return 1'
        return 1
    } else if (versionPackageJsonSplit[iteration].toInteger() < versionTagRepoSplit[iteration].toInteger()) {
        println 'return -1'
        return -1
    }
}

a.groovy

.
.
.

compareVersionsResult = b (versionPackageJsonSplit, versionTagRepoSplit, 0)
println compareVersionsResult
.
.
.
.


```

到目前為止,我發現可靠地做到這一點的最不糟糕的方法是創建一個內部帶有遞歸閉包的頂級包裝器方法:

def recursiveMethod(args) {
  Closure rec
  rec = { arg ->
    if (recursiveCase) {
      return rec(…)
    }
    else {
      return baseCase
    }
  }

  return rec(…)
}

好處是您可以從閉包中引用方法 args 或方法范圍的 state 變量,而不必在遞歸堆棧中傳遞它們,因此遞歸調用可能看起來更簡潔一些。 缺點是需要額外的樣板來進行包裝,而且閉包 args 的命名必須不同於方法 args 或 Groovy 會引發錯誤。

暫無
暫無

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

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