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

时间:2017-06-23 13:13:32

标签: 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)) {
        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变量为null。我已经设法通过改变它来解决它:

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对象上调用方法server()

如果我尝试"技巧"通过做:

def Artifactory = Artifactory

我得到了这个例外:

  

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

有人可以帮助解释这里发生了什么以及我做错了什么吗?

1 个答案:

答案 0 :(得分:0)

我不知道Jenkins管道脚本,但是使用Groovy知识和你描述的内容,问题是你给了wsHash的闭包,并将委托设置为空地图(config ),因此请求scm,然后返回null

我想如果你明确地命名节点闭包的it参数并使用它应该可以工作,如:

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

        stage('Build') {
            bat '.\\src\\Build.cmd'
        }
    }
}

您收到的其他错误,Refusing to marshal错误很可能是由于管道中的其他部分导致"foo $bar baz"类似GString而您需要String相反,请改用"foo $bar baz" as String,动态部分将立即解析并转换为普通String对象。

相关问题