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

Jenkins pipeline: how to access custom globals from groovy scripts in vars dir?

我可以像这样将 class 实例声明为全局实例:

gitUtils = new GitUtils()

pipeline {
  ...
  echo "hello: " + gitUtils.doSomething()
}

但是如果管道调用“vars”目录中定义为 groovy 脚本的函数,gitUtils 将不再可见

def call() {
  def something = gitUtils.doSomething()
}

我也尝试过使用@Field,但它没有任何改变。请注意,所有管道都在共享库中定义(项目 jenkinsfile 仅调用此共享库中的一个函数)。

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

我知道我们可以将实例作为在 /vars 中声明的函数的参数传递,但更多的是使用实用的函数 class,更多的是丑陋的。你会想象将 'echo' 或 'sh' 函数作为参数传递吗?不,这里也是一样。

我知道我们根本无法使用在 src 中定义的 classes 并使用多个 public 方法定义 groovy 脚本。在这里我们可以想象在 /vars 中使用许多 public 方法创建一个 gitutils.groovy。但这意味着在管道中使用 'script' 闭包来选择我们想要的方法,如下所示:

script {
  gitutils.doSomething()
}

我不要这个。我希望在 /vars 中为每个 groovy 脚本创建一个函数。因此,我们可以直接分步调用它们,像这样:

 steps {
    myGroovyScriptFunction()
 }

但是这样一来,函数的数量增加了,而且函数组织得不正确。这就是为什么我们的想法是在 /vars 中创建“大步函数”,它使用内部更通用的函数,来自 classes 的实例(在更好的情况下甚至是静态的)。因此,我想要一个全局实例,而不是在每个 groovy 脚本中创建一个新实例。

上下文:声明式管道、openshift jenkins、具有动态 pod 模板的从属

不可能,因为 JENKINS-42360

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

# vars/myStep.groovy

import my.packagename.GitUtils

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

然后您可以使用 GitUtils 中描述的步骤 here。请记住根据文档定义 GitUtils 以实施 Serializable