我可以这样声明一个全局的类实例:
gitUtils = new GitUtils()
pipeline {
...
echo "hello: " + gitUtils.doSomething()
}
但是,如果管道在“ vars”目录中调用了定义为groovy脚本的函数,gitUtils
则不再可见
def call() {
def something = gitUtils.doSomething()
}
我也尝试使用@Field,但它什么也没改变。请注意,所有管道都在共享库中定义(项目jenkinsfile只是从该共享库调用一个函数)。
在此示例中,如何从/ vars中的groovy脚本访问gitUtils?
我知道我们可以将实例作为在/ vars中声明的函数的参数来传递,但是更多的函数使用实用类,这更加丑陋。您是否想将'echo'或'sh'函数作为参数传递?不,这是一样的。
我知道我们不能在src中定义的所有类上使用并且不能使用多个公共方法定义groovy脚本。在这里,我们可以想象在/ vars中创建具有许多公共方法的gitutils.groovy。但这意味着要在管道中使用“脚本”闭包来选择所需的方法,如下所示:
script {
gitutils.doSomething()
}
我不想要这个。我倾向于在/ vars中为每个groovy脚本创建一个函数。因此,我们可以直接分步调用它们,如下所示:
steps {
myGroovyScriptFunction()
}
但是这样做会增加功能的数量,并且功能无法正确组织。这就是为什么要在/ vars中创建“大步函数”的原因,该函数在类的实例中使用更通用的函数(在更好的情况下甚至是静态的)。因此,我想要一个全局实例,而不是在每个常规脚本中创建一个新实例。
上下文:声明式管道,openshift詹金斯,具有动态pod模板的从属
因为JENKINS-42360是不可能的。
我认为,在没有脚本块的情况下使用全局步骤的最佳方法是定义一个实例GitUtils
并直接在全局步骤中使用它。如果需要管道步骤上下文,可以将其传递给构造函数:
# vars/myStep.groovy
import my.packagename.GitUtils
def call() {
GitUtils gitUtils = new GitUtils(steps)
...
}
然后您可以GitUtils
按照此处所述使用内部步骤。请记住要按照文档定义GitUtils
实施Serializable
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句