从管道中的函数调用全局Jenkins库

从管道中的函数调用全局Jenkins库,jenkins,groovy,jenkins-pipeline,Jenkins,Groovy,Jenkins Pipeline,鉴于: 此代码起作用,并调用库utils #!groovy @Library('GreatUtils') def utils = new com.X.Utils(script:this) node { stage('Call utils.check directly') { utils.check() } } #!棒极了 @库('GreatUtils') def utils=new com.X.utils(脚本:this) 节点{ 阶段('间接调用utils

鉴于:

此代码起作用,并调用库
utils

#!groovy

@Library('GreatUtils')
def utils = new com.X.Utils(script:this)

node {
    stage('Call utils.check directly') {
        utils.check()
    }
}
#!棒极了
@库('GreatUtils')
def utils=new com.X.utils(脚本:this)
节点{
阶段('间接调用utils.check'){
checkUtils()
}
}
def checkUtils(){

groovy函数中的utils.check()无法访问其作用域之外的变量declare,出现错误的原因很简单,因为您的变量
utils
超出了作用域

像这样通过参数传递它应该可以工作

#!groovy

@Library('GreatUtils')
def utils = new com.X.Utils(script:this)

node {
    stage('Call utils.check indirectly') {
        checkUtils()
    }
}

def checkUtils() {
    utils.check() << -- throws exception 
}
或者,如果您不想使用参数,您可以选择函数式编程风格并使用

编辑:

添加全局初始化可能性

#!groovy

@Library('GreatUtils')
def utils = new com.X.Utils(script:this)

def check = { -> utils.check() }
node {
    stage('Call utils.check indirectly') {
       check()
    }
}

应该可以工作。

如果在节点逻辑之前定义checkUtils()函数,会发生什么情况?例如,将所有的def放在节点{…}之前,如果没有工作,请尝试:-(另一个选项(我认为很难看)是使变量“全局范围化”-不用
def utils
只需编写
utils
。哦,我不知道,谢谢你提供的信息。但是正如你所说的,global=ught,如果可以的话应该避免。巴普蒂斯特,谢谢-这很有效(闭包不是选项).mkobit-你的建议不起作用,谢谢你…不能使用闭包,因为库包含多个方法,它们都需要被调用加上额外的代码-这就是私有方法的用途…现在,我不介意使用全局方法来保存UTIL,有人知道如何做吗-本质上,让mkobit建议的方法起作用吗?
#!groovy

@Library('GreatUtils')
def utils = new com.X.Utils(script:this)

def check = { -> utils.check() }
node {
    stage('Call utils.check indirectly') {
       check()
    }
}
#!groovy

@Library('GreatUtils')
utils = new com.X.Utils(script:this)

node {
    stage('Call utils.check indirectly') {
        checkUtils()
    }
}

def checkUtils() {
    utils.check()
}