我的 Groovy 共享库的目录结构:
+- src # Groovy source files
| +- org
| +- company
| +- Stage.groovy # for org.company.Stage class
+- vars
+- func.groovy # for global var func()
共享库文件:
// src/org/company/Stage.groovy
package org.company;
class Stage implements Serializable {
static def func(d) {
println("org.company.Stage.func()")
}
}
// vars/func.groovy
def func(d) {
println("func.groovy:func()")
}
在我的管道
Jenkinsfile
中,我尝试同时调用全局变量func()
和类静态函数org.company.Stage.func()
:
// Jenkinsfile
pipeline {
agent any
stages {
stage('1') {
steps {
testLoadLib()
}
}
}
}
void testLoadLib() {
loadLibrary('foo@dev')
}
void loadLibrary(String libraryName) {
def lib = library(libraryName)
def d = [:]
func.func(d)
lib.org.company.Stage.func(d)
}
输出(针对相关性进行了编辑):
Loading library foo@dev
...
[Pipeline] echo
func.groovy:func()
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
输出似乎表明全局变量
def func()
已执行——它的 println()
出现在控制台输出中。org.company.Stage.func()
既没有错误也没有它的 println 出现在控制台输出中。
此管道中发生了什么及其对共享库函数的调用?
为什么只执行全局变量?
我需要什么才能执行类函数?
上面的代码基于 http://rtyler.github.io/jenkins.io/doc/book/pipeline/shared-libraries/ 的演练——但我不知道我做错了什么与该链接中记录的内容相比。
对于一般的全局变量方法,
<groovy fiile name>.<method name>
(在您的情况下func.func
)确实是正确的语法。但是,要从共享库调用方法,您首先需要使用构造函数实例化该类:
def stage = new org.company.Stage()
stage.func(d)
在您的使用中,命名空间语法不正确,并且该类被用作单例(据我所知,这与 Jenkins Pipeline 不兼容)。
或者您也可以
import org.company.Stage.func
来自库,但是 func
将由全局变量方法和库定义,这可能会导致问题。
您可以在问题中链接的文档的“访问步骤”部分查看有关此信息。