我创建了一个管道共享库来创建工作空间哈希,以便我们避免在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
有人可以帮助解释这里发生了什么以及我做错了什么吗?
答案 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
对象。