1

我正在尝试划分管道。大多数参数都成功传递,但那些包含变量的参数在我需要之前就被解析了。

詹金斯版 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”)。事实上我想得到的命令是(一些文件只包含一个数字,例如“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 类 - 它等于“class org.codehaus.groovy.runtime.GStringImpl”,并且在传递 throw 后在构建阶段也相同 - 它变成了一个字符串:“class java.lang.String”

那么如何将包含变量的函数参数传递给函数,而不是它的值?或者将“呼吸生命”变成一根干燥的绳子,比如

'make.exe \\some\\path\\file_${VERSION}'

所以变量可以解决吗?

4

1 回答 1

0

选项 1 - 惰性求值 ( @NonCPS)

您可以将GString 与惰性评估一起使用,但由于 Jenkins 不会序列化惰性GStrings,因此您必须从@NonCPS如下方法返回它:

@NonCPS
def getPostBuildAction() {
    "make.exe \\some\\path\\file_${ -> VERSION }"
}

stage ('prebuild') {
    ...
}

然后你设置POSTBUILDACTION=getPostBuildAction(),你可以POSTBUILDACTION根据需要使用,但要注意你在这里的对象是 agroovy.lang.GString而不是 a String,所以你需要改变你的参数类(或简单地使用def。)

选项 2 - 每次调用都使用闭包

GString您可以在闭包内使用渴望:

def String getPostBuildAction() {
    "make.exe \\some\\path\\file_$VERSION"
}

但是在这里你getPostBuildAction()每次想要不同的阅读时都必须调用VERSION,所以你必须POSTBUILDACTION用这个闭包替换。

于 2019-05-22T10:15:57.737 回答