Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
访问jenkins管道闭包体中的变量_Jenkins_Groovy_Jenkins Pipeline - Fatal编程技术网

访问jenkins管道闭包体中的变量

访问jenkins管道闭包体中的变量,jenkins,groovy,jenkins-pipeline,Jenkins,Groovy,Jenkins Pipeline,我创建了一个管道共享库来创建工作区哈希,这样我们就可以避免windows版本中的路径长度问题: import java.security.MessageDigest def call(body) { def config = [:] body.resolveStrategy = Closure.DELEGATE_FIRST body.delegate = config ws(getWsHash(config.length ?: 10)) { b

我创建了一个管道共享库来创建工作区哈希,这样我们就可以避免windows版本中的路径长度问题:

import java.security.MessageDigest

def call(body) {
    def config = [:]
    body.resolveStrategy = Closure.DELEGATE_FIRST
    body.delegate = config

    ws(getWsHash(config.length ?: 10)) {
        body()
    }
}

def getWsHash(length) {
    def md5Hash = MessageDigest.getInstance("MD5").digest("${env.JOB_NAME}_${env.EXECUTOR_NUMBER}".bytes).encodeHex().toString()
    return md5Hash.substring(0,10)
}
我想这样使用:

node('windows') {

    wsHash {
        stage('Checkout') {
            checkout scm
        }

        stage('Build') {
            bat '.\\src\\Build.cmd'
        }
    }
}
但是,这会失败,因为
scm
变量为空。我已通过更改为以下方式解决了此问题:

node('windows') {

    def scm = scm

    wsHash {
        stage('Checkout') {
            checkout scm
        }

        stage('Build') {
            bat '.\\src\\Build.cmd'
        }
    }
}
然而,这既笨重又不适用于所有实例。例如,我们还使用了artifactory,在尝试使用它时:

def server = Artifactory.server('advancedcsg')
我得到以下例外情况:

java.lang.NullPointerException:无法对null对象调用方法服务器()

如果我通过以下方式尝试“技巧”:

def Artifactory = Artifactory
我得到一个例外:

java.lang.UnsupportedOperationException:出于安全原因拒绝封送org.codehaus.groovy.runtime.GStringImpl


有人能帮我解释一下这里发生了什么以及我做错了什么吗?

我不知道Jenkins管道脚本,但根据Groovy知识和您所描述的,问题是您将闭包设置为
wsHash
,然后将委托设置为空映射(
config
),因此,
scm
被请求并返回
null

我猜如果您显式地命名节点闭包的
it
参数并使用它,它应该可以工作,比如:

node('windows') { windowsNode ->
    wsHash {
        stage('Checkout') {
            checkout windowsNode.scm
        }

        stage('Build') {
            bat '.\\src\\Build.cmd'
        }
    }
}
您得到的另一个错误是,
拒绝封送
错误很可能是由于管道中的另一部分导致的,其中您有类似于
的“foo$bar baz”
,这是一个
GString
,您需要一个
字符串
,因此请使用
foo$bar baz改为字符串
,动态部分将立即解析并转换为普通的
字符串
对象