【发布时间】:2017-10-16 04:02:41
【问题描述】:
总结:当使用并行构建时,Groovy 中的工作空间路径与 shell 不同。如何从 DSL 或 Groovy 获取实际的工作空间?
详情:
我们的工作区是通过ws( '/path/to/workspace' ) 定义的。
我正在尝试使用相对路径,即package.json,在当前目录(通常是工作区根目录)中打开该文件。当作为 shell 运行时,sh 'jq -r ".version" package.json' 工作正常,我可以毫无问题地阅读package.json。
但是使用 Groovy:
def version = new groovy.json.JsonSlurper().parseText( new File( "package.json" ).text )[ 'version' ]
注意new File( "package.json" ) 然后它会因为声称$WORKSPACE/package.json 不存在而失败。尽管我们使用ws 设置了上面的工作区,但我可以看到它最终会变成类似于 /path/to/workspace/my_job-SOMERANDOMCHARS... 而不是ws 中指定的目录。 p>
我了解,在并行工作负载中,我们需要使工作区独一无二,因此这并不意外。但是我应该如何从 Groovy 确定工作空间?还是期望总是突破到实际在节点上运行的 shell?
更新:更多上下文
有关如何使用它的更多信息。我们的 Groovy(非声明式)管道按照以下方式进行操作:
stage('tests') {
parallel(
'Unit Tests': {
node('unitNode') {
ws('/path/to/workspace') {
new file("${env.WORKSPACE}/package.json") // does not work
sh 'cat $WORKSPACE/package.json' // works OK
}
}
},
'E2E Tests': {
node('e2eNode') {
ws('/path/to/workspace') {
new file("${env.WORKSPACE}/package.json") // does not work
sh 'cat $WORKSPACE/package.json' // works OK
}
}
}
)
}
【问题讨论】: