问题描述
在Jenkins中有一个父级Groovy文件,它会加载并使用子级Groovy文件。但是在尝试从父级Groovy文件中访问在子级Groovy文件中定义的变量时,无法访问这些变量。用户想知道是否只能使用环境变量来实现全局访问。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
在Groovy中,可以使用import groovy.transform.Field
注解来定义全局变量。以下是一个示例:
import groovy.transform.Field
@Field
public String a = "first letter"
@Field
public String b = "second letter"
在上面的示例中,我们使用import groovy.transform.Field
导入了Field
注解,并使用@Field
注解定义了全局变量a
和b
。这样就可以在其他地方访问这些变量了。
方案2
如果要引用环境变量,可以使用以下格式:
@Field
public String c
c = 'prefix ' + System.getenv('VAR') + ' suffix'
在上面的示例中,我们使用@Field
注解定义了全局变量c
,并将其赋值为'prefix ' + System.getenv('VAR') + ' suffix'
。这样就可以在其他地方访问这个变量了。
请注意,这些方法只是在Groovy文件中定义全局变量的一种方式。如果您想要更高级的代码重用性和可维护性,建议使用Jenkins的Shared Libraries功能。您可以参考The Jenkins Standard Library来了解如何使用共享库。
方案3
您提供的示例代码有一个拼写错误:b = "second letter;
缺少闭合引号。即使您修复了这个错误,您的代码仍然无法工作。
如果您打印child
变量,它将为null
。这是因为您在child-groovy-file
的底部缺少return this
。
在Jenkins的load文档中提到了这一点:
Where
pipeline.groovy
definesfunctionA
andfunctionB
functions (among others) before ending withreturn this;
我修复了您的代码并运行了这个POC:
这导致了以下结果:
虽然像这样加载脚本可能有一些用例,但它们并不常见。如果您想要可重用的代码,建议使用Jenkins的Shared Libraries功能。如果您想要查看使用共享库可以做什么的示例,请参考The Jenkins Standard Library,它可以运行Github Actions!我也恰好是该库的作者。