如何将变量名而不是其值作为参数传递给/ var函数?

时间:2019-05-21 12:51:37

标签: jenkins jenkins-pipeline jenkins-shared-libraries

我正在尝试划分管道。大部分参数成功传递,但是包含变量的参数在我需要之前已解决。

詹金斯版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}'

那么变量可以解析吗?

1 个答案:

答案 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