Jenkins升级后共享脚本调用警告:如何保留pipeline外部定义的方法
我在多个Jenkins流水线中一直用以下方式调用共享脚本:
@Library('SharedScripts') _ myUtils= new shared.scripts.myUtils() pipeline{ .... // 某个阶段 myFunction() } def myFunction(){ // 一些计算操作 myUtils.foo() }
其中myUtils.groovy文件位于src/shared/scripts/目录,代码如下:
package shared.scripts def foo(){ //一些操作 }
Jenkins更新到最新版本后,myUtils= new shared.scripts.myUtils()这句触发了警告:Did you forget the "def" keyword?。但如果给变量加上def关键字写成def myUtils= new shared.scripts.myUtils(),myUtils会变成局部变量,导致pipeline块外部定义的myFunction无法访问它。我不想把myFunction的逻辑移到pipeline块内部,想保留现有代码结构提升可读性,同时避免重构大量流水线。
这里有几种不用大规模重构就能解决问题的方法:
方法1:使用@Field注解
Groovy的@Field注解可以把脚本里的局部变量提升为类级别字段,既保留def关键字消除警告,又能让外部定义的方法访问到这个变量。
修改后的代码:
@Library('SharedScripts') _ import groovy.transform.Field @Field def myUtils= new shared.scripts.myUtils() pipeline{ .... // 某个阶段 myFunction() } def myFunction(){ // 一些计算操作 myUtils.foo() }
这个方法最直接,仅需添加注解和导入语句,几乎不用改动原有逻辑。
方法2:将变量绑定到全局binding对象
把myUtils存入Jenkins Pipeline的全局binding对象中,确保变量在全局范围内可见,同时用def定义变量消除警告。
修改后的代码:
@Library('SharedScripts') _ def myUtils= new shared.scripts.myUtils() binding.setVariable("myUtils", myUtils) pipeline{ .... // 某个阶段 myFunction() } def myFunction(){ // 一些计算操作 myUtils.foo() }
这种方式利用Groovy脚本的绑定机制,保证变量能被外部方法正常访问。
方法3:给myFunction传递参数
将myUtils作为参数传入myFunction,即使myUtils是局部变量,也能在函数内部正常使用,同时保留def消除警告。
修改后的代码:
@Library('SharedScripts') _ def myUtils= new shared.scripts.myUtils() pipeline{ .... // 某个阶段 myFunction(myUtils) } def myFunction(def utils){ // 一些计算操作 utils.foo() }
这个方法需要修改函数调用和定义,但改动幅度很小,适合不想使用注解或绑定机制的场景。
内容的提问来源于stack exchange,提问作者Mehmet Hakan Kurtoğlu

