在Groovy文件中如何定义全局变量,以便加载和使用?

247次阅读
没有评论

问题描述

在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注解定义了全局变量ab。这样就可以在其他地方访问这些变量了。

方案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 defines functionA and functionB functions (among others) before ending with return this;

我修复了您的代码并运行了这个POC:

在Groovy文件中如何定义全局变量,以便加载和使用?

这导致了以下结果:

在Groovy文件中如何定义全局变量,以便加载和使用?

虽然像这样加载脚本可能有一些用例,但它们并不常见。如果您想要可重用的代码,建议使用Jenkins的Shared Libraries功能。如果您想要查看使用共享库可以做什么的示例,请参考The Jenkins Standard Library,它可以运行Github Actions!我也恰好是该库的作者。

正文完