Jenkins管道:如何从vars dir中的groovy脚本访问自定义全局变量?

Jenkins管道:如何从vars dir中的groovy脚本访问自定义全局变量?,groovy,jenkins-pipeline,jenkins-declarative-pipeline,Groovy,Jenkins Pipeline,Jenkins Declarative Pipeline,我可以将类实例声明为全局实例,如下所示: gitUtils = new GitUtils() pipeline { ... echo "hello: " + gitUtils.doSomething() } 但是,如果管道调用“vars”目录中定义为groovy脚本的函数,gitUtils将不再可见 def call() { def something = gitUtils.doSomething() } 我也尝试使用@Field,但它没有改变任何东西。请注

我可以将类实例声明为全局实例,如下所示:

gitUtils = new GitUtils()

pipeline {
  ...
  echo "hello: " + gitUtils.doSomething()
}
但是,如果管道调用“vars”目录中定义为groovy脚本的函数,
gitUtils
将不再可见

def call() {
  def something = gitUtils.doSomething()
}
我也尝试使用@Field,但它没有改变任何东西。请注意,所有管道都是在共享库中定义的(project jenkinsfile只是从该共享库调用一个函数)

在本例中,如何从/vars中的groovy脚本访问gitUtils?

我知道我们可以将实例作为/vars中声明的函数的参数传递,但是使用实用类的函数越多,它就越难看。您是否可以将“echo”或“sh”函数作为参数传递?不,这是一样的

我知道我们不能在src中定义的所有类上使用,也不能用多个公共方法定义groovy脚本。在这里,我们可以想象在/vars中创建一个带有许多公共方法的gitutils.groovy。但这意味着在管道中使用“脚本”闭包来选择我们想要的方法,如下所示:

script {
  gitutils.doSomething()
}
 steps {
    myGroovyScriptFunction()
 }
我不要这个。我建议在/vars中为每个groovy脚本创建一个函数。因此,我们可以分步直接调用它们,如下所示:

script {
  gitutils.doSomething()
}
 steps {
    myGroovyScriptFunction()
 }
但这样做,功能数量增加,功能组织不正确。这就是为什么我们的想法是在/vars中创建“大步函数”,它在更通用的函数中使用类的实例(更好的情况下是静态的)。因此,与其在每个groovy脚本中创建一个新实例,不如创建一个全局实例


上下文:声明性管道,openshift jenkins,带有动态pod模板的从机

由于以下原因,这是不可能的

在我看来,在不使用脚本块的情况下使用全局步骤的最佳方法是定义
GitUtils
的实例,并在全局步骤中直接使用它。如果需要管道步骤上下文,可以将其传递给构造函数:

# vars/myStep.groovy

import my.packagename.GitUtils

def call() {
    GitUtils gitUtils = new GitUtils(steps) 
    ...
} 

然后,您可以使用inside
GitUtils
中所述的步骤。记得根据文档定义
GitUtils
来实现
Serializable

我不能使用env,因为我说的是类实例。另外,你所说的关于vars/script的内容并不真实,这正是本文的目的:你不能访问定制的全局groovy var。最后一点:你是对的,我们可以在groovy脚本中定义多个公共方法,但您不能从声明性管道访问它们,除非您添加我不想要的脚本闭包(当您使用call()定义单个方法时,您可以直接从更漂亮的“步骤”访问它)。在本例中(myVar是一个字符串),我的示例是开箱即用的,因为env变量总是字符串。对于bean,您可以选择序列化然后反序列化对象。在所有其他情况下,您必须重新考虑管道结构,并直接在全局脚本中创建对象。我还不清楚为什么你不能(或不想)使用参数。谢谢你更新的答案。这种行为对我来说毫无意义,我们必须多次创建实例,我们应该能够从/vars中定义的函数到达全局范围。此外,我不理解将“步骤”作为参数的兴趣,因为我们可以使用groovy特性,它允许我们声明具有全局范围访问权限的类,如您给出的文档链接的第一个示例所述。保持特定步骤的“状态”可能很有趣,但无论如何,这似乎是一种不好的做法。依我看,这个类理想上应该充满静态函数,我们不能这样做,因为我们会失去对静态(sh,echo,…)全局范围的访问。你怎么认为?