我正在尝试划分管道。大部分参数成功传递,但是包含变量的参数在我需要之前已解决。
詹金斯版2.164.1
Jenkins.file content:
stage ('prebuild') {
steps {
script {
VERSION="temprorary-value"
POSTBUILDACTION="make.exe \\some\\path\\file_${VERSION}"
}
}
}
stage ('build') {
steps {
script {
build (POSTBUILDACTION)
}
}
}
build.groovy content:
def call (String POSTBUILDACTION) {
...
checkout somefile
VERSION=readFile(somefile)
bat "${POSTBUILDACTION}"
}
在这里,我希望该版本将从重新定义的VERSION变量中获取,但POSTBUILDACTION作为字符串传递给该函数。结果,它按原样调用(“ make.exe \ some \ path \ file_temprorary-value”)。实际上,我想获取的命令是(somefile仅包含一个数字,例如“ 5”)
make.exe \some\path\file_5
但是现在我有
make.exe \some\path\file_temprorary-value
或者如果我尝试通过\ $ {VERSION},例如:
POSTBUILDACTION="make.exe \\some\\path\\file_\${VERSION}"
-它按原样转移:
make.exe \some\path\file_${VERSION}
我尝试在预构建阶段查看POSTBUILDACTION类-等于“ org.codehaus.groovy.runtime.GStringImpl类”,并且在传递阶段在传递阶段也是如此-它变成字符串:“ java.lang类.String”
那么如何传递给包含变量的函数参数,而不是变量的值呢? 要么 将生命“呼吸”成干燥的弦线
'make.exe \\some\\path\\file_${VERSION}'
那么变量可以解析吗?
答案 0 :(得分:0)
选项1-惰性评估(@NonCPS
)
您可以使用GString with lazy evaluation,但是由于Jenkins不会序列化懒惰的GString
,因此必须从@NonCPS
方法返回它,如下所示:
@NonCPS
def getPostBuildAction() {
"make.exe \\some\\path\\file_${ -> VERSION }"
}
stage ('prebuild') {
...
}
然后,您设置POSTBUILDACTION=getPostBuildAction()
并可以根据需要使用POSTBUILDACTION
,但是请注意,此处拥有的对象是groovy.lang.GString
而不是String
,因此您将需要更改参数类(或只需使用def
。)
选项2-每次通话都使用闭包
您可以在闭包内使用急切的GString
:
def String getPostBuildAction() {
"make.exe \\some\\path\\file_$VERSION"
}
但是在这里,每次您想读不同的getPostBuildAction()
时,都必须调用VERSION
,因此必须用此闭包替换POSTBUILDACTION
。