如何在Jenkinsfile中动态加载共享库并执行同名全局变量方法?
解决Jenkins流水线迭代加载多共享库并执行同名全局方法的问题
你现在碰到的问题是:依次加载foo@dev、bar@dev两个共享库,调用各自的func方法时,两次都执行了foo@dev的实现,没法按预期分别执行对应库的方法。
问题原因
Jenkins的全局变量(vars目录下的脚本)一旦加载,会在当前流水线的作用域中留存。直接调用func.func(d)时,会优先使用已经加载到全局作用域的第一个库的func实例,不会自动切换到新加载库的版本。
解决方案
修改runGlobalVariableMethod方法,通过library()返回的库对象来访问对应库的全局变量,而不是直接调用全局名称的func。
修改后的Jenkinsfile代码
// Jenkinsfile pipeline { agent any stages { stage('1') { steps { testLoadLib() } } } } void testLoadLib() { runGlobalVariableMethod('foo@dev') runGlobalVariableMethod('bar@dev') } void runGlobalVariableMethod(String libraryName) { def lib = library(libraryName) def d = [:] // 通过加载的库对象获取当前库的func实例并调用 lib.func(d) }
共享库代码无需修改
foo共享库的vars/func.groovy:
def func(d) { println("foo func.groovy:func()") }
bar共享库的vars/func.groovy:
def func(d) { println("bar func.groovy:func()") }
原理说明
library(libraryName)会返回对应共享库的对象实例,这个实例包含了该库所有的全局变量和类定义。通过lib.func可以精准获取当前加载库的func全局变量,完全避开全局作用域中已存在的同名变量干扰,从而实现每个库的方法独立执行。
内容的提问来源于stack exchange,提问作者StoneThrow
相关产品推荐
相关产品推荐

