Jenkins共享库中Groovy源文件能否调用全局变量的方法?
Jenkins共享库中Groovy源文件能否调用全局变量的方法?
我的共享库结构如下:
(root) +- src # Groovy源文件 | +- org | +- foo | +- CallMethodFromVars.groovy # 对应org.foo.CallMethodFromVars类 +- vars | +- foo.groovy # 全局变量'foo'的实现
我希望在src.org.foo.CallMethodFromVars类中调用vars.foo.groovy里的call(arg)方法。
当前代码
src/org/foo/CallMethodFromVars.groovy:
class CallMethodFromVars { String run(){ // TODO 在这里调用vars.foo.groovy的call()方法 } }
vars/foo.groovy:
def call(arg) { doSomething() }
已尝试但失败的方案
import var.*;foo.groovy.call(arg)def method = this.class.classLoader.loadClass('vars.foo'); method.call(arg)def engine = new GroovyScriptEngine("/path-to-library/vars/foo.groovy"); engine.run('call', [arg])def method = library.vars.foo; method.call(arg)def method = libraryContext.getVariable("foo"); method.call(arg)method = System.getenv('foo'); method.call(arg)- 上述所有方案均尝试过用
method()替代method.call(arg)
解决方案
Jenkins共享库的src目录下的类默认无法直接访问vars里的全局变量,因为vars中的脚本是绑定到Jenkins Pipeline运行时上下文的,并非普通Groovy类。以下两种方法可以解决这个问题:
方法1:提取公共逻辑到工具类(推荐)
把vars/foo.groovy中的业务逻辑提取到src目录的工具类中,让vars脚本和其他src类都调用这个工具类,既解耦又符合共享库的设计规范。
- 创建工具类
src/org/foo/FooUtil.groovy:
class FooUtil { static def doSomething(arg) { // 原来foo.groovy中的业务逻辑 println "处理参数:${arg}" } }
- 修改
vars/foo.groovy调用工具类:
import org.foo.FooUtil def call(arg) { FooUtil.doSomething(arg) }
- 在
CallMethodFromVars.groovy中直接调用工具类:
import org.foo.FooUtil class CallMethodFromVars { String run(String arg) { FooUtil.doSomething(arg) return "执行完成" } }
方法2:传递Pipeline上下文到src类
如果必须直接调用vars中的脚本,需要把Jenkins Pipeline的运行时上下文传递给src类,因为vars脚本依赖这个上下文(比如steps、env等内置对象)。
- 修改
CallMethodFromVars.groovy,添加构造方法接收上下文:
class CallMethodFromVars { private final Script pipelineContext // 构造方法传入Pipeline上下文 CallMethodFromVars(Script pipelineContext) { this.pipelineContext = pipelineContext } String run(String arg) { // 通过上下文调用全局变量foo pipelineContext.foo(arg) return "执行完成" } }
- 在Pipeline脚本中使用该类时,传入当前上下文:
@Library('你的共享库名称') _ def caller = new org.foo.CallMethodFromVars(this) caller.run("测试参数")
内容的提问来源于stack exchange,提问作者Marcin Kulik
相关产品推荐
相关产品推荐

