访问jenkins管道闭包体中的变量
我创建了一个管道共享库来创建工作区哈希,这样我们就可以避免windows版本中的路径长度问题:访问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
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改为字符串
,动态部分将立即解析并转换为普通的字符串
对象