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
。
我可以像这样将 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
。